2012-04-23 55 views
1

我有下面的类反序列化对象:用序列成员类

[Serializable] 
public class A : ISerializable 
{ 

List<B> listOfBs = new List<B>(); 

public A() 
     { 
     // Create a bunch of B's and add them to listOfBs 
     } 

public A(SerializationInfo info, StreamingContext context) 
     { 
     listOfBs = (List<B>)info.GetValue("listOfBs",typeof(List<B>)) 
     listOfBs.Remove(x=>x.s==5) 
     } 

} 

[Serializable] 
public class B : ISerializable 
{ 
    public int s; 
    public B(int t) 
     { 
      s=t; 
      } 

    public B(SerializationInfo info, StreamingContext context) 
     { 
     s = info.GetInt32("s"); 
     } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
     info.AddValue("s",s); 
     } 
} 

line listOfBs.Remove(x=>x.s==5)抛出一个异常,因为B的反序列化构造函数不运行,直到问题A完成了。 当我遍历代码时,A的listOfBs只是一个NULL对象的条目,它与匹配多少个B的列表中的实际内容相匹配

如何解决这个反序列化序列问题?

回答

2

实施IDeserializationCallback。在整个对象图的反序列化完成时调用IDeserializationCallback.OnDeserialization

我相信A级会是实现它的最佳场所,并且您会将问题代码放在A.OnDeserialization中,如下所示。

[Serializable] 
public class A : ISerializable, IDeserializationCallback 
{ 
    List<B> listOfBs = new List<B>(); 
    public A() 
    { 
    // Create a bunch of B's and add them to listOfBs 
    } 

    public void OnDeserialization() 
    { 
    listOfBs.Remove(x=>x.s==5) 
    } 
} 
+0

谢谢!像魅力一样工作。我很遗憾,只有一个人赞成放弃 – Matt 2012-04-23 23:14:29