【问题标题】:C# Serialization / Deserialization: Same object different projectC#序列化/反序列化:相同对象不同项目
【发布时间】:2015-07-13 14:54:32
【问题描述】:

基本示例:

Person person = new Person("Bob",50);
BinaryFormatter binaryFormatter = new BinaryFormatter();
MemoryStream memoryStream = new MemoryStream();
binaryFormatter.Serialize(memoryStream, person);

Byte[] data = memoryStream.ToArray();

MemoryStream received = new MemoryStream(data,false);

object obj = binaryFormatter.Deserialize(received);

if (obj is Person)
{
    Person des = obj as Person;

    Console.WriteLine("{0} {1}", des.Name, des.Age);
}

问题是,如果我在不同的项目中创建相同的类(名称、字段),我将无法重建字节流。

有什么解决办法吗?

【问题讨论】:

  • 这里使用 MemoryStream 的原因是什么?你到底想做什么?
  • 正如您的回答所说,二进制序列化包含详细的类型信息(不仅是完整的命名空间,还有版本),并且您不能反序列化为另一种类型(即使它看起来相同,如果它在不同的组件中,它的类型不同)。唯一的解决方案是将其移动到两个项目都可以引用的程序集或使用不同形式的序列化。更糟糕的是,如果您修改包含它的程序集,它可能会破坏您的序列化对象。

标签: c# serialization


【解决方案1】:

将共享代码放在第三个项目中,然后在您当前的两个项目中引用该共享项目。

现在他们都可以访问课程,但不能访问您不想共享的任何内容。

您使用 .net 二进制序列化是否有特殊原因?

更现代的方法是使用像 JSON 这样的数据格式。

特别是JSON.Net。

它更加灵活,允许您反序列化为任何“看起来”相同的类,甚至可以使用字典或动态对象。

这是另一个 SO 答案,描述了为什么二进制格式化程序不是一个好选择:I hate to say it, but my first pointer here would be "don't do that"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2021-11-30
    • 2023-02-05
    • 2014-07-10
    相关资源
    最近更新 更多