2009-03-02 5 views
1

편집 : 내 문제에 대한 해결책은 IXMLSerializer를 구현하는 것입니다. 빠른 답변을 보내 주신 모든 분들께 감사드립니다.ISerialization 생성자가 호출되지 않습니다.

안녕하세요.이 문제가 발생하여 적절한 해결책을 찾지 못하는 것 같습니다.

나는 다음과 같은 클래스를 가지고

내가

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

를 역 직렬화하려면 다음 코드를 사용하여

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

을 deserialzed 할 수있는 다음과 같은 XML을 보내는 경우 내가 생각

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><Child><Id>10</Id></Child></Test> 
내가 다른 응용 프로그램에서 게시 된 XML을 얻고 있기 때문에

, 그래서 수동으로 자식 개체를 생성하고 내에서 수동으로 값을 할당 할 필요가 건설자.

정말로 도움을 주셔서 감사합니다.

답변

7

XML 직렬화를 사용자 정의하려면 ISerializable 대신 IXmlSerializable을 사용해야한다고 생각합니다.

매개 변수없는 생성자가 필요하다고 생각하면 ReadXmlWriteXml을 구현해야합니다. 즉, 이진 직렬화와 동일한 생성자를 사용하지 않습니다.

3

사용하는 시리얼 라이저 변수는 무엇입니까? XmlSerializer 인 경우 XmlSerializer가 지원하지 않으므로 직렬화 후크가 호출되지 않습니다 (IXmlSerializable 참조).

+0

저는 XmlSerializer를 사용하고 있습니다 만, 직렬화 생성자는 직렬화 복원시 호출됩니다. – Paleta

+0

어떤 serializer를 사용해야합니까? – Paleta

2

XmlSerializer는 SerializableAttribute, ISerializable 또는 SerializationInfo 정보 및 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; 
     } 
+0

MemoryStream과 함께 Binary Formatter를 사용하고 MemoryStream 내부에 XML을 쓰려고하는데이 오류가 계속 발생합니다. "System.ArgumentException : 스트림을 읽을 수 없습니다." 저는 정말로 여기에서 길을 잃었습니다. 스트림은 BinaryFormatting withing으로 읽을 수 있어야합니다. – Paleta

+0

제 대답에 몇 가지 코드를 추가했습니다. 그것은 나를 위해 작동합니다. –

+0

좋아,하지만 게시 한 경우, XML을 받고 클래스로 역 직렬화하려고합니다. BinaryFormatter를 사용하여 어떻게하면됩니까? – Paleta

관련 문제