2009-03-02 20 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を取得していますので、私は手動で子オブジェクトを作成し、内から手動でその値を割り当てる必要がありますので、私が代わりにこの1

<?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

どのシリアライザを使用しますか? – Paleta

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

私はMemoryStreamと一緒にバイナリフォーマッタを使用して、MemoryStreamの中にXMLを書き込もうとしていますが、このエラーが続きます。 "System.ArgumentException:ストリームが読み込みできませんでした。 私は実際にここで失われています、ストリームはBinaryFormatting withingで利用できるはずです – Paleta

+0

私の答えにいくつかのコードを追加しました。わたしにはできる。 –

+0

あなたが投稿した場合は、XMLを受け取っていて、それをクラスに逆直列化したいと思います。 BinaryFormatterを使って、どうすればいいですか? – Paleta

関連する問題