【问题标题】:Can strong naming cause problems with object serialization in C#?强命名会导致 C# 中的对象序列化问题吗?
【发布时间】:2009-05-19 09:21:39
【问题描述】:

我序列化一些配置对象并将结果字节存储在数据库中。

new BinaryFormatter().Serialize(memoryStream, instance);
Convert.ToBase64String(memoryStream.ToArray());

这些对象稍后将被反序列化。

new BinaryFormatter().Deserialize(memoryStream);

应用程序在反序列化时可能有一些新的程序集版本。一般来说,它运行良好,但有时我会遇到文件加载异常: “找到的程序集的清单定义与程序集引用不匹配。”。这些程序集都使用强命名,这可能是问题吗?我该如何避免这个问题?

感谢您的帮助

【问题讨论】:

    标签: c# serialization strongname


    【解决方案1】:

    当然,将BinaryFormatter 与数据库(即长期)存储一起使用是个坏主意; BinaryFormatter两个三大故障(默认):

    • 它包括类型元数据(如果您移动/重命名您的类型,这可能意味着强名称/版本控制)
    • 它包括字段名称(字段是私人详细信息!)
    • 它是 .NET 特定的(如果您想使用其他任何东西,这会很痛苦)

    我的blog post here 提出了两个具体问题 - 混淆和自动实现的属性...我不会在这里重复文本,但您可能会觉得它很有趣。

    我建议使用基于合同的序列化。 XmlSerializerDataContractSerializer 通常就足够了。如果您想要小型高效二进制文件,那么protobuf-net 可能会很有趣。与BinaryFormatter 不同,来自此的二进制文件可在实现之间移植、可扩展(用于新字段)等。它是quicker and smaller, too

    【讨论】:

    • 我已经想到的XmlSerializer的解决方案,我的同伴没有实现它有两个想法,1.二进制序列化比合同序列化更快,2.它不是人类可读的。听起来很奇怪,但我们不能相信我们自己的市场支持,他们触及一切^^。我会看看你的建议,也许我会找到解决办法。
    • 关于这一点:protobuf-net 比 BinaryFormatter 快,仍然不可读,并且没有 BinaryFormatter 的所有痛点......当然,压缩也会使 xml 不可读(作为另一种可能性)。
    【解决方案2】:

    我认为 WCF 可能是您最好的选择。它可以处理将未知字段传递给它的消费者,即使它不知道如何反序列化它们。

    例子:

    服务 A:了解具有描述字段的 Widget 类的版本 2

    服务 B:知道没有描述字段的 Widget 类的版本 1

    服务 C:了解具有描述字段的 Widget 类的版本 2

    如果服务 A 调用服务 B 传递一个 Widget 对象,然后服务 B 调用服务 C 传递同一个 Widget 对象,那么服务 C 将获得描述字段,因为它是从服务 A 传递的。服务 B 将没有任何描述但是当它反序列化并重新序列化它时,它只会传递描述字段而不知道它是什么。

    因此,您可以将 WCF 服务与进程内通信一起使用。

    有关versioning wcf contracts 的更多信息,请参阅此链接。

    【讨论】:

    • 我们已经遇到了强命名和WCF的问题,另外它会是一个更多的抽象层,只会让程序员感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2010-11-09
    相关资源
    最近更新 更多