2009-03-02 192 views
1

編輯:我的問題的解決方案是實現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,所以我需要手動創建的子對象,並從內手動分配其價值構造函數。

我真的很感謝您能給我提供的所有幫助和指導。

回答

7

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

我認爲這需要一個無參數構造函數,然後您需要實現ReadXmlWriteXml。換句話說,它不使用與二進制序列化相同的構造函數。

3

什麼是你使用的序列化變量?如果它是XmlSerializer,則不會調用您的序列化掛鉤,因爲XmlSerializer不支持它們(請參閱IXmlSerializable)。

+0

我正在使用XmlSerializer,但我雖然在反序列化時會調用序列化構造函數。 – Paleta 2009-03-02 13:26:27

+0

我應該使用什麼串行器? – Paleta 2009-03-02 13:27:05

2

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; 
     }