0

私の質問はとても簡単です。

Fooクラスがあると想像してください。Tプロパティがあります。

public class Foo<T>
{
    public T Property { get; set; }
}

IXmlSerializableを実装したいのですが、問題は、標準のXmlSerializationを模倣することができないことです。標準のXmlSerlalizationのようにこのプロパティを作成する方法については本当にわかりません。

更新:私はこれをしました、そしてそれは機能していません

public class Foo<T> : IFoo
    where T : IXmlSerializable
{
    public T Value { get; set; }
}

public class FooA : Foo<string> { }
public class FooB : Foo<int> { }
public class FooC : Foo<List<Double>> { }

このクラス(A、B、C)をシリアル化したとき。私はこのようなものが欲しいです:

ファーストクラスの使用:

<FooA>
    <Value>StringDemo</Value>
</FooA>

2番目のクラスの使用:

<FooB>
    <Value>2</Value>
</FooB>

3番目のクラスの使用:

<FooC>
    <Value>
        <ArrayOfDouble xsi:..>
            <Double>3.1416</Double>
            <Double>4.2</Double>
        </ArrayOfDouble>
    </Value>
</FooC>

このようなものが私が望んでいたものです。このすべてにカスタムXmlSerializerを実装したくありません。つまり、標準のシリアル化で使用されるデフォルトを意味します。

4

1 に答える 1

1

、および TにIXmlSerializableを実装する必要があります( を使用します。 の実装は、型情報 ( WriteXml 内)を持つラッパー要素を記述し、 Tを呼び出し、型情報 ( ReadXml内)からインスタンスを再作成します。 Tに電話。Foo<T>where T : IXmlSerializableFoo<T>WriteXmlReadXml

とのような基本的な型はStringDoubleはないため、それらをサポートしたい場合IXmlSerializableは持つことができません。とwhere T : IXmlSerializableのデフォルトの実装を提供することもできます。を呼び出す前にを作成する必要があり、を知る必要があるため、これは機能します。ReadXmlWriteXmlFoo<T>ReadXmlT

public class Foo<T> : IXmlSerializable {
    public T Value { get; set; }

    XmlSchema IXmlSerializable.GetSchema() {
        return GetSchema();
    }

    protected virtual XmlSchema GetSchema() {
        return null;
    }

    public virtual void ReadXml(XmlReader reader) {
        reader.ReadStartElement();
        var xmlSerializer = new XmlSerializer(typeof(T));
        Value = (T)xmlSerializer.Deserialize(reader);
        reader.ReadEndElement();
    }

    public virtual void WriteXml(XmlWriter writer) {
        var xmlSerializer = new XmlSerializer(typeof(T));
        xmlSerializer.Serialize(writer, Value);
    }
}
于 2012-05-04T04:38:03.850 に答える