2011-06-23 20 views
0

現在、派生クラスを使用しているときにXMLからの逆シリアル化に問題があります。シリアライゼーションは正常に動作しますが、その逆を実行すると予期しない要素の例外が発生します。派生型のXMLSerializationの問題

サンプルコード:

public class Foo 
{ 
    //Some Properties 
} 

public class Bar : Foo 
{ 
    //more properties 
} 

public class Holder : IXmlSerializable 
{ 
    public Foo SomeObject; 

    public void WriteXML(XmlWriter writer) 
    { 
     var lizer = new XmlSerializer(SomeObject.GetType()); 
     lizer.Serialize(writer,SomeObject); 
    } 

    public void ReadXML(XmlReader reader) 
    { 
     reader.MoveToContent(); 
     reader.ReadStartElement(); 

     var lizer = new XmlSerializer(typeof(Foo), new Type[] { typeof(Bar) }); 

     SomeObject = (Foo)lizer.Deserialize(reader); 
    } 

Holder.SomeObjectがバーのインスタンスに設定されている場合は直列化が期待どおりに動作します。しかし、逆シリアル化は投げている。私がXmlSerializer ctorに正しいタイプを選択する可能性のあるすべての型を指定したのは私の理解でした。

これは該当しないのですか、それとも何か不足していますか?おかげ

+0

私は変数名として「lizer」を好みます。 Deserializeから取得した例外を確認すると便利です。 – alexdej

答えて

1

あなたは、あなたがデシリアライズされた場合、すなわち、あなたのコードは、これに変更と同じようにシリアル化するときにXmlSerializerに同じコンストラクタを使用する必要があります。

public void WriteXML(XmlWriter writer) 
{ 
    var lizer = new XmlSerializer(typeof(Foo), new Type[] { typeof(Bar) }); 
    lizer.Serialize(writer,SomeObject); 
} 
+0

ありがとう、これは基本的なケースのために動作します。しかし、BarはIXmlSerializableを実装しています。Holder.WriteXML中に例外が発生しました。「タイプバーはこのコンテキストでは使用できません」 – JMcCarty

+0

これは正しいと思います。新しいXmlSerializer(typeof(Foo))ルートxml要素となりますが、objがBarの新しいXmlSerializer(obj.GetType())を実行すると、ルートxml要素はになります。 – alexdej

関連する問題