在许多情况下,当我想将当前的.NET Framework项目转换为.NET Core等效项时,某些类具有Serializable属性.
我应该怎么做才能在.NET Core中转换它们?(在这个时候我删除它们!!!)
编辑
考虑以下代码:
using System;
namespace DotLiquid.Exceptions
{
[Serializable] // I delete it now !!!!!!!
public class FilterNotFoundException : Exception
{
public FilterNotFoundException(string message, FilterNotFoundException innerException)
: base(message, innerException)
{
}
public FilterNotFoundException(string message, params string[] args)
: base(string.Format(message, args))
{
}
public FilterNotFoundException(string message)
: base(message)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有[Serializable]在.NET Core中工作,没有语法问题.
但我想知道什么时候删除[Serializable]
什么是副作用?
哪些地方应该改变?
我什么时候应该使用JSON.NET(或...)而不是[Serializable]?
Joe*_*kes 21
更新此处的问题.
微软似乎已将SerializeAttribute移植到一个单独的nuget包中:System.Runtime.Serialization.Formatters
您可以使用此nuget包.虽然我不知道为什么他们以后添加它.
他们删除了它,因为它们也删除了二进制序列化,它主要用于此.也许他们仍然把它带回来为其他类型的序列化创建基础(如json,xml等).因为它们仍然需要相同的基础(至少是json):你不能使用接口或抽象属性,因为de deserializer不知道要为这个属性创建哪个对象.
也许有人可以对这种情况有所了解,或者当我知道更多时,我会.
我的想法是你把这个属性放在一个类上,告诉它是可序列化的,这意味着:
为什么?
因为在反序列化时反映了类及其属性,如果反射会找到一个接口作为属性,它就不知道要创建哪个子类(右边的dll甚至可能都没有被加载,像这样的问题).
所以在代码中:
public class NotSerializableObject {
public IEnumerable<Test> property {get; set;}
}
public interface AlsoNotSerializableObject {
List<Test> property {get; set;}
}
public class SerializableObject {
public List<Test> property {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这个属性和二进制格式化程序本身存在许多问题(实际检查此属性的唯一(de)序列化程序).
属性问题:在编译期间无法强制执行,因此只有在运行时才会出现错误,首先:错误,您忘记了SerializableAttribute.并且只有在运行时稍后才会出现错误您无法使用IEnumerable,因为它是一个接口.所以它只能创造额外的工作而不是解决任何问题.
他们没有使用二进制格式迁移它,因为他们认为它已经被删除或者"必须重做"那里有一些重大问题(他们在他们的一个视频会话/ confs中说过这样的事情).
我发现到目前为止与IPC结合的唯一问题是,在DateTime对象上,Kind属性未被(de)序列化.
但它又回到了这个nuget包中:https://www.nuget.org/packages/BinaryFormatter/ .
似乎他们甚至推出了一个新版本(2.1.0),这可能表明他们想要延长其生命周期.
他们试图将人们带到新的'Dotnet Core'(而不是完整的框架).他们使用的策略之一是移植所有内容,即使他们认为代码很糟糕,也不应该被任何人/"更好的开源替代品"使用,这样人们就可以更容易地迁移他们的旧代码.
1缺点是很难找到关于什么nuget-packages/dll应该被认为是"糟糕"的适当信息以及哪些nuget包从哪里彻底重做并建议再次使用.
Ste*_*eve 10
由于序列化涉及的复杂性和兼容性问题,已从.Net Core中删除了二进制序列化.相反,决定序列化应该是基于协议的.请参阅:https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md#binary-serialization
这确实不会影响大多数用例,因为您可以使用XML Serializer或第三方软件包,如json.net
Ric*_*lay 10
如果您没有序列化类型(即使用BinaryFormatter),那么您可以删除[Serializable]并忘记它.
如果你以前使用BinaryFormatter进行序列化,那么你需要提出自己的计划,看看它是如何工作的(即通过Json.net或XML).
如果您要移植一个库并代表您的消费者询问,那么答案是相同的:删除[Serializable]并将序列化留给需要它的人.