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

NBM*_*NBM 26 c# .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)
        {
        }
    }
}
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不知道要为这个属性创建哪个对象.

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

什么是SerializeableAttribute(origin)

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

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

为什么?

因为在反序列化时反映了类及其属性,如果反射会找到一个接口作为属性,它就不知道要创建哪个子类(右边的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

  • 您应该在目前正在进行序列化的任何地方使用替代方案.Json.Net是一个很好的,但还有其他人.从本质上讲,开发人员已经将序列化的责任转移到了堆栈而不是在Core内部. (2认同)

Ric*_*lay 10

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

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

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


Mar*_*skI 6

更新给定的答案:

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