反序列化其程序集和命名空间已更改的类

时间:2012-03-01 00:52:30

标签: serialization namespaces assemblies

我有这里描述的问题:

http://social.msdn.microsoft.com/Forums/en-AU/csharplanguage/thread/b310c71a-2479-4a93-888a-29294cecbe09

他们使用SerializationBinder提供解决方案。还有另一种选择吗?就像用不同的命名空间和程序集装饰我的类一样?原因是我有一些类已经多次使用过这个问题,我必须在代码的每个部分添加“formatter.Binder = ...”这一行。应用我的第二种解决方案会更容易。

感谢。

1 个答案:

答案 0 :(得分:0)

如果程序集版本更改,则序列化对象将变为无效。我曾经对Protobuf-Net的源代码进行了更改以避免版本检查,并且这样做很容易。但是,它可能会导致意外结果(数据以错误的字段结尾),除非您避开隐式字段,并使用注释手动设置每个字段的索引。这是优势或Protobuf-Net,您可以控制序列化流中字段的顺序。

另一个解决方案是使用custom serialization?类似的东西:

[Serializable]
public class MyObject : ISerializable 
{
  public int n1;
  public int n2;
  public String str;

  public MyObject()
  {
  }

  protected MyObject(SerializationInfo info, StreamingContext context)
  {
    n1 = info.GetInt32("i");
    n2 = info.GetInt32("j");
    str = info.GetString("k");
  }
[SecurityPermissionAttribute(SecurityAction.Demand, 
SerializationFormatter =true)]

public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("i", n1);
    info.AddValue("j", n2);
    info.AddValue("k", str);
  }
}