2010-12-27 5 views
2

TestChildオブジェクトを含むTestオブジェクトの配列をシリアル化しようとしています。サブクラスで満たされた基本クラスの配列をXMLにシリアル化するにはどうすればいいですか?

public class Test 
{ 
    public string SomeProperty { get; set; } 
} 

public class TestChild : Test 
{ 
    public string SomeOtherProperty { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     Test[] testArray = new[] 
     { 
      new TestChild { SomeProperty = "test1", SomeOtherProperty = "test2" }, 
      new TestChild { SomeProperty = "test3", SomeOtherProperty = "test4" }, 
      new TestChild { SomeProperty = "test5", SomeOtherProperty = "test6" }, 
     }; 

     XmlSerializer xs = new XmlSerializer(typeof(Test)); 

     using (XmlWriter writer = XmlWriter.Create("test.xml")) 
      xs.Serialize(writer, testArray); 
    } 
} 

TestChildをTestに変換できないというInvalidOperationExceptionが表示されます。

これは意味がありますが、とにかくそれを行う方法はありますか?

答えて

1

最も簡単な方法は、注釈を付けることですそれ以外の場合は

[XmlInclude(typeof(TestChild))] 
public class Test 
{ 
    public string SomeProperty { get; set; } 
} 

XmlSerializerのために、より複雑なコンストラクタを使用している場合)あなた:クラスシリアライザは、サブクラスを見込んように、 非常にシリアライザインスタンスをキャッシュして再使用することに注意する必要があります。そうでなければ、メモリを流出させます(ガベージコレクションできないたびにアセンブリが作成されます。 最も簡単なコンストラクタを取るだけでTypeがこのキャッシュを処理します)。

+0

ありがとうございました! (特にキャッシングのアドバイスのため) – neo2862

0

また、あなたがテストアレイTest[]なくTestをシリアル化され、proper constructorを使用することにより、既知の型を指定することができ、コンストラクタのので、最初の引数はtypeof(Test[])次のようになります。

var xs = new XmlSerializer(typeof(Test[]), new Type[] { typeof(TestChild) }); 
関連する問題