.NET Core中的等价物是什么? (转换项目)

在许多情况下,当我想将当前的.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) { } } } 

上面没有[Serializable]的代码在.NET Core中工作,没有语法问题。

但是我想知道什么时候删除[Serializable]

什么是副作用?

哪些地方应该改变?

我什么时候应该使用JSON.NET(或…)而不是[Serializable]?

如果您没有序列化类型(即使用BinaryFormatter ),那么您可以删除[Serializable]并忘记它。

如果你以前使用BinaryFormatter进行序列化,那么你需要提出自己的计划,看看它是如何工作的(即通过Json.net或XML)。

如果您要移植一个库并代表您的消费者询问,那么答案是相同的:删除[Serializable]并将序列化保留给需要它的人。

更新此处的问题。

微软似乎已将SerializeAttribute移植到一个单独的nuget包中: System.Runtime.Serialization.Formatters

您可以使用此nuget包。 虽然我不知道为什么他们以后添加它。

他们删除了它,因为它们也删除了二进制序列化,它主要用于此。 也许他们仍然把它带回来为其他类型的序列化创建基础(比如json,xml等)。 因为它们仍然需要相同的基础(至少是json):您不能使用接口或抽象属性,因为反序列化器不知道要为此属性创建哪个对象。

也许有人可以对这种情况有所了解,或者当我知道更多时,我会。

什么是SerializeableAttribute(origin)

我的想法是你把这个属性放在一个类上,告诉它是可序列化的,这意味着:

  • 对象’不能’拥有子类
  • 对象桅杆上的属性是具体类(因此没有抽象类或接口)

为什么?

因为在反序列化时反映了类及其属性,如果reflection会找到一个接口作为属性,它就不知道要创建哪个子类(右边的dll甚至可能都没有被加载,像这样的问题)。

所以在代码中:

 public class NotSerializableObject { public IEnumerable property {get; set;} } public interface AlsoNotSerializableObject { List property {get; set;} } public class SerializableObject { public List property {get; set;} } 

为何被“弃用”

这个属性和二进制格式化程序本身存在许多问题(实际检查此属性的唯一(de)序列化程序)。

属性问题:在编译期间无法强制执行,因此只有在运行时才会出现错误,首先:错误,您忘记了SerializableAttribute。 并且只有在运行时稍后才会出现错误您无法使用IEnumerable,因为它是一个接口。 所以它只能创造额外的工作而不是解决任何问题。

他们没有使用二进制格式迁移它,因为他们认为它已经被删除或者“必须重做”那里有一些重大问题(他们在他们的一个video会话/ confs中说过这样的事情)。

我发现到目前为止与IPC结合的唯一问题是,在DateTime对象上,Kind属性未被(de)序列化。

但它又回到了这个nuget包中: https ://www.nuget.org/packages/BinaryFormatter/。

似乎他们甚至推出了一个新版本(2.1.0),这可能表明他们想要延长其生命周期。

他们为什么要迁移它?

他们试图将人们带到新的’Dotnet Core’(而不是完整的框架)。 他们使用的策略之一是移植所有内容,即使他们认为代码很糟糕,也不应该被任何人/“更好的开源替代品”使用,这样人们就可以更容易地迁移他们的旧代码。

1缺点是很难找到关于什么nuget-packages / dll应被视为“糟糕”的正确信息以及哪些nuget包从哪里完全重做并建议再次使用。

由于序列化涉及的复杂性和兼容性问题,已从.Net Core中删除了二进制序列化。 相反,决定序列化应该是基于协议的。 请参阅: https : //github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md#binary-serialization

这确实不会影响大多数用例,因为您可以使用XML Serializer或第三方软件包,如json.net

更新给定答案:

.Net Core 2.0 现在支持类型子集的二进制序列化,您可以在此处查看完整列表