ISerialization构造函数没有被调用

问题描述:

编辑:我的问题的解决方案是实现IXMLSerializer。感谢大家的快速反应。ISerialization构造函数没有被调用

大家好,我有这个问题,我似乎没有找到一个适当的解决方案。

我有以下类

public class Child 
     { 
      private int _id; 

      public int Id 
      { 
       get { return _id; } 
       set { _id = value; } 
      } 

     } 
     [Serializable] 
     public class Test: ISerializable 
     { 
      private int _id; 

      public int Id 
      { 
       get { return _id; } 
       set { _id = value; } 
      } 

      private Child _child = new Child(); 

      public Child Child 
      { 
       get { return _child; } 
       set { _child = value; } 
      } 

      public Test() 
      { 
      } 
      protected Test(SerializationInfo info, StreamingContext context) 
      { 
       if (info.MemberCount > 1) 
        Child.Id = info.GetInt32("ChildId"); 
      } 


      #region ISerializable Members 

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

      #endregion 
     } 

如果我把下面的XML使用下面的代码进行反序列化

<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><ChildId>10</ChildId></Test> 

反序列化

serializer.Deserialize(new StringReader("<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><ChildId>10</ChildId></Test>"); 

我认为这将要求我的序列化构造函数,但事情是,永远不会被调用。

我现在用的是张贴以上XML,而不是这一个

<?xml version="1.0" encoding="utf-16"?><Test><Id>0</Id><Child><Id>10</Id></Child></Test> 

因为我越来越从另一个应用程序发布的XML,所以我需要手动创建的子对象,并从内手动分配其价值构造函数。

我真的很感谢您能给我提供的所有帮助和指导。

定制XML序列化我相信你需要使用IXmlSerializable而不是ISerializable

我认为这需要一个无参数构造函数,然后您需要实现ReadXmlWriteXml。换句话说,它不使用与二进制序列化相同的构造函数。

什么是你使用的序列化变量?如果它是XmlSerializer,则不会调用您的序列化挂钩,因为XmlSerializer不支持它们(请参阅IXmlSerializable)。

+0

我正在使用XmlSerializer,但我虽然在反序列化时会调用序列化构造函数。 – Paleta 2009-03-02 13:26:27

+0

我应该使用什么串行器? – Paleta 2009-03-02 13:27:05

XmlSerializer不使用SerializableAttribute,ISerializable也不使用SerializationInfo info和StreamingContext参数的构造函数。这些结构在使用SoapFormatter(废弃)和BinaryFormatter进行序列化时使用。

 BinaryFormatter bf = new BinaryFormatter(); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      Class1 c1 = new Class1(); 
      bf.Serialize(ms, c1); 

      ms.Position = 0; 
      Class1 c2 = bf.Deserialize(ms) as Class1; 
     }