在.net Core中,[Serializable]的等效是什么?(项目)的转换

本文关键字:是什么 项目 转换 Core Serializable net | 更新日期: 2023-09-27 18:04:23

在很多情况下,当我想要将当前。net框架项目转换为。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] ?

在.net Core中,[Serializable]的等效是什么?(项目)的转换

更新这里的问题。

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

你可以使用这个nuget包。虽然我不知道为什么他们后来添加了它。

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

也许有人能解释一下这个情况,或者当我知道更多的时候我会的。

什么是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;}
}

为什么'deprecated'

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

属性的问题:它不能在编译时强制执行,所以只有在运行时你才会得到错误,首先:错误你忘记了SerializableAttribute。只是后来在运行时你得到错误你不能使用IEnumerable,因为它是一个接口。所以它只会增加额外的工作量,而不是解决任何问题。

他们没有用二进制格式迁移这个,因为他们认为它是过时的或'必须重做',其中有一些主要问题(他们在一个视频会谈/会议中说过类似的话)。

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

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

似乎他们甚至推出了一个新版本(2.1.0),这可能表明他们想延长它的寿命。

他们为什么要迁移它?

他们正试图将人们转移到新的"Dotnet核心"(而不是完整的框架)。他们使用的策略之一是移植所有的东西,即使他们认为代码很糟糕,不应该被任何人使用/"更好的开源替代方案",这样人们更容易移植他们的旧代码。

1的缺点是很难找到适当的信息,哪些nuget包/dll应该被认为是"蹩脚的",哪些nuget包是完全从头开始重做的,建议再次使用。

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

如果你以前使用BinaryFormatter序列化,那么你需要想出你自己的计划,如何工作(即。

如果你正在移植一个库并代表你的消费者请求,那么答案是相同的:删除[Serializable]并将序列化留给那些需要它的人。

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

这并不影响大多数用例,因为你可以使用XML序列化器或第三方包,如json.net

更新为给定的答案:

。Net Core 2.0 现在支持类型子集的二进制序列化,您可以在这里看到完整的列表