2012-03-01 50 views
0

我在这里所描述的问题:反序列化类,其装配和命名空间已经改变

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

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

谢谢。

回答

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); 
    } 
} 
+0

这是一个有效的方法,但活页夹更简单。感谢你的回答。我认为只有这两种可能性。 – user994432 2012-04-18 23:31:49