C#序列化/反序列化:相同对象不同项目

C#序列化/反序列化:相同对象不同项目,c#,serialization,C#,Serialization,基本示例: Person person = new Person("Bob",50); BinaryFormatter binaryFormatter = new BinaryFormatter(); MemoryStream memoryStream = new MemoryStream(); binaryFormatter.Serialize(memoryStream, person); Byte[] data = memoryStream.ToArray(); MemoryStream

基本示例:

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);
}
问题是,如果在不同的项目中创建相同的类(名称、字段),则无法重建字节流


有什么解决方案吗?

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

现在,他们都可以访问该类,但不能访问您不希望共享的任何内容

使用.net二进制序列化有什么特殊原因吗

更现代的方法是使用类似JSON的数据格式

具体地说

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


下面是另一个SO答案,描述了为什么二进制格式化程序不是一个很好的选择:

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