3

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

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

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

new BinaryFormatter().Deserialize(memoryStream);

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

感谢帮助

4

2 回答 2

2

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

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

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

我建议使用基于合同的序列化。XmlSerializer或者DataContractSerializer正常就足够了。如果您想要小型高效二进制文件,那么protobuf-net可能会引起您的兴趣。与 不同BinaryFormatter的是,由此产生的二进制文件在实现之间是可移植的、可扩展的(用于新字段)等。而且它也更快、更小

于 2009-05-19T10:09:02.687 回答
0

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

例子:

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

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

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

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

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

有关版本化 wcf 合同的更多信息,请参阅此链接。

于 2009-05-19T09:36:17.837 回答