1

基本クラスと、基本クラスにプロパティを追加するいくつかの派生クラスがあります

これまで、派生クラスの混合オブジェクトでいっぱいのリストを常にシリアライズおよびデシリアライズしてきました。[XmlInclude(typeof(child))]そして、C# を追加するためにそれを行う唯一のことは、残りの処理を行います。

今回はリストに入れるのではなく、派生クラスのオブジェクトを直接シリアライズ/デシリアライズしたい。最も興味深い部分は、オブジェクトがリストにある間にオブジェクトをシリアル化すると、生成された xml が「直接」シリアル化とは異なることです。さらに、直接シリアル化されたオブジェクトをその基本クラス項目のインスタンスに逆シリアル化することはできませんが、リストは正常に逆シリアル化されます (以下に例を追加しました)。

これは、サンプル クラスのコードです。

    [XmlInclude(typeof(child))]
    public abstract class father 
    { ... }

    public class child : father
    {
        public double Sum { get; set; }
        public char Currency { get; set; }
    }

以下の例の初期化コードは次のとおりです。

 father oD = new child() { Currency = '$', Sum = 1 };
 string xml_str = Tools.Serialize(oD);

XML 出力は次のとおりです。

<child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Sum>1</Sum><Currency>36</Currency></child>

オブジェクトをリストに入れてリストをシリアル化すると、出力は

<ArrayOfFather xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><father xsi:type="child"><Sum>1</Sum><Currency>36</Currency></father></ArrayOfFather>

ご覧のとおり、XML は異なります。

<father xsi:type="child"><Sum>1</Sum><Currency>36</Currency></father>

問題は、次の 2 行が機能することです (逆シリアル化ターゲットとして子クラスを提供しているため)。

 child oD1 = Tools.DeSerializeGeneric<child>(xml_str);
 father oD2 = Tools.DeSerializeGeneric<child>(xml_str);

3 番目のもの (および必要なもの) を逆シリアル化することができません

 father oD4 = Tools.DeSerializeGeneric<father>(xml_str);

スロー

System.InvalidOperationException: There is an error in XML document (1, 2). ---> System.InvalidOperationException: <child xmlns=''> was not expected.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderfather.Read4_father()
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
   at Tools.DeSerializeGeneric[T](String source) in Dev-testing:\Tools.cs:line 1549
   at Program.Main(String[] args) in Dev-testing:\Program.cs:line 48

コードで使用されるのTools.DeSerializeGenericは、ダミーの逆シリアル化関数です。

    public static T DeSerializeGeneric<T>(string source)
    {
        XmlSerializer x = new XmlSerializer(typeof(T));
        StringReader SsR = new StringReader(source);
        return (T) x.Deserialize(SsR);
    }

オブジェクトを強制的にその基本クラスとしてシリアル化する方法はありますか (リストで発生するように)。

4

0 に答える 0