【问题标题】:how to serialize and deserialize over two different assembly?如何对两个不同的程序集进行序列化和反序列化?
【发布时间】:2021-06-06 11:09:28
【问题描述】:

这是一个C# 项目。我使用 BinaryFormatter 作为我的应用程序的序列化器和反序列化器。
因为有两个应用程序并且程序集名称彼此不同,我正在使用序列化绑定器来解决查找类型的问题。
但我仍然收到一个错误:

Unable to find assembly 'GameServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

这是我的序列化活页夹代码:

    public override Type BindToType(string assemblyName, string typeName)
    {
        if (assemblyName.Contains("GameServer"))
        {
            assemblyName = "Assembly-CSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=12345";
        }
        return Type.GetType(typeName);
    }

在上面的代码中,我只是检查是否找到名为“GameServer”的程序集,然后将其重命名为本地程序集名称。
我在这里错过了什么吗?

【问题讨论】:

    标签: c# serialization binaryformatter


    【解决方案1】:

    老实说,这里唯一的“好”答案是“不要使用BinaryFormatter”,紧随其后的是“真的,不要使用BinaryFormatter”。有many good reasons that it is considered deprecated in .NET Core / .NET 5+,匹配类似类型的这个小不便:甚至没有列出那个列表! (顺便说一句,您可以通过将 DTO 类型移动到其他项目都引用的库程序集来避免这样做)。

    注意:对于几乎任何其他序列化程序 - JSON、xml、protobuf 等 - 它已经“正常工作”:不同程序集中的类型无关紧要。坦率地说,这里最好的建议就是:“更改序列化程序”。

    【讨论】:

    • 慢慢地,我打算将我的序列化程序更改为 json(newtonsoft)。甚至没有 protobuf 或任何二进制格式化程序。稳定的原因。谢谢。
    • @aidin FWIW 在稳定性方面与 Newtonsoft 属于同一类别;唯一的区别是格式不是人类可读的
    • 我更喜欢这首歌(水牛乐队)哈哈。我现在正在为我的项目使用消息包。但它不能很好地支持另一个对象中的对象(比如在列表中有类,而这两个在字典中)。你会为我的场景推荐一个更好的序列化程序吗?认为我必须为每一层序列化多次。
    • @aidinjj 我有很大的偏见,但听起来 protobuf-net 在那里会很好,而且添加到现有模型中也很简单
    • protobuf 很好,但我不知道为什么它不支持 c# 中的哈希表数据结构。 “没有为类型定义序列化程序:System.Collections.Hashtable”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2012-01-01
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多