【问题标题】:What is the equivalent of [Serializable] in .NET Core ? (Conversion Projects).NET Core 中 [Serializable] 的等价物是什么? (转换项目)
【发布时间】:2016-08-29 05:31:05
【问题描述】:

在很多情况下,当我想将当前的 .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]?

【问题讨论】:

    标签: c# .net-core


    【解决方案1】:

    更新此处的问题。

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

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

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

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

    什么是SerializeableAttribute(来源)

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

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

    为什么?

    因为在反序列化时会反射类及其属性,如果反射会找到一个接口作为属性,它将不知道要创建哪个子类(甚至可能没有加载正确的 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;}
    }
    

    为什么它被“弃用”

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

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

    他们没有使用二进制格式迁移它,因为他们认为它已被废弃或“必须重做”,其中存在一些重大问题(就像他们在其中一个视频谈话/confs 中所说的那样)。

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

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

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

    他们为什么要迁移它?

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

    1 个缺点是很难找到正确的信息来说明哪些 nuget-packages/dll 应该被视为“糟糕”,以及哪些 nuget 包从头开始完全重做并建议再次使用。

    【讨论】:

      【解决方案2】:

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

      如果您之前使用 BinaryFormatter 进行序列化,那么您需要制定自己的计划来了解其工作方式(即通过 Json.net 或 XML)。

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

      【讨论】:

      • 还有更多关于 BinaryFormatter 和 .NETCore 的信息吗?
      【解决方案3】:

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

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

      【讨论】:

      • 你能再次看到我的帖子吗?我为我的问题添加了一个示例,我看到了上面的链接,但仍然不知道什么时候应该使用 JSON.NET 等替代品
      • 您应该在当前进行序列化的任何地方使用替代方案。 Json.Net 是一个很好的,但还有其他的。从本质上讲,开发人员已经将序列化的责任移到了堆栈上,而不是在 Core 内部进行。
      【解决方案4】:

      更新给定答案:

      .Net Core 2.0 现在支持部分类型的二进制序列化,可以查看完整列表here

      【讨论】:

      • 怎么办?任何sn-p?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 2020-10-05
      • 2010-10-02
      • 1970-01-01
      相关资源
      最近更新 更多