1

私のシナリオ:

XmlElement タグで装飾されたプロパティで定義したオブジェクトと、定義した型を持つオブジェクトがあります。そのうちのいくつかは、それぞれの派生型に設定される抽象型として型指定されています。XmlSerializer を使用してこのオブジェクト全体を XML にシリアル化したいのですが、抽象型のすべてのプロパティは、TypeName が派生型の TypeName に設定された要素としてシリアル化される必要があります。

これは、オブジェクトがどのように構造化されているかの例です。

[XmlType(TypeName = "MAINOBJECT")]
public class MainObject
{
    [XmlElement(Type = typeof(DerivedClass))]
    public BaseClass TheBase { get; set; }
}

[XmlInclude(typeof(DerivedClass))]
public abstract class BaseClass
{
    [XmlAttribute("AnAttribute")]
    public string AnAttribute { get; set; }

    [XmlElement("ANELEMENT")]
    public string AnElement { get; set; }

}

[XmlType(TypeName = "DERIVEDCLASS")]
public class DerivedClass : BaseClass
{
    [XmlElement("ANOTHERELEMENT")]
    public string AnotherElement { get; set; }

}

ただし、MainObject の新しいインスタンスを作成し、そのプロパティを設定してシリアル化すると、生成された XML は次のようになります。

<MAINOBJECT>
    <BaseClass AnAttribute="">
            <ANELEMENT/>
            <ANOTHERELEMENT/>
    </BaseClass>
</MAINOBJECT>

私が欲しいのはこれです:

<MAINOBJECT>
    <DERIVEDCLASS AnAttribute="">
            <ANELEMENT/>
            <ANOTHERELEMENT/>
    </DERIVEDCLASS>
</MAINOBJECT>

ここで私が間違っている手がかりはありますか?

4

3 に答える 3

1

ここでの最善の解決策は、IXmlSerializableインターフェイスを実装して、オブジェクトのシリアル化方法を完全に制御できるようにすることだと思います。確かに手間はかかりますが、このような通常とは異なる要件がある場合は、標準の XmlSerializer がうまく機能しなくなるという問題に遭遇する可能性もあります。

ここに良いチュートリアルがあります: IXmlSerializable を正しく実装する方法

また、ここにいくつかの良い情報があります: IXmlSerializable を実装する適切な方法?

于 2014-09-04T12:09:05.200 に答える
1

XmlElement 名を次のようTheBaseに追加します。MainObject

[XmlType(TypeName = "MAINOBJECT")]
public class MainObject
{
    [XmlElement("DERIVEDCLASS", Type = typeof(DerivedClass))]
    public BaseClass TheBase { get; set; }
}
于 2014-09-03T17:52:15.390 に答える
0

最善の解決策ではないかもしれませんが、

class Program
    {
        static void Main(string[] args)
        {
            XmlAttributes attrs = new XmlAttributes();

            XmlElementAttribute attr = new XmlElementAttribute();
            attr.ElementName = "DerivedClass";
            attr.Type = typeof(DerivedClass);

            attrs.XmlElements.Add(attr);

            XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();

            attrOverrides.Add(typeof(MainObject), "TheBase", attrs);

            XmlSerializer s = new XmlSerializer(typeof(MainObject), attrOverrides);

            StringWriter writer = new StringWriter();

            MainObject mo = new MainObject { TheBase = new DerivedClass { AnAttribute = "AnAttribute", AnElement = "AnElement", AnotherElement = "AotherElement" } };

            s.Serialize(writer, mo);
            Console.Write(writer.ToString());
        }
    }
于 2014-09-03T17:52:03.753 に答える