使用IXmlSerialization,如何序列化T属性?

时间:2012-05-04 03:44:34

标签: c# xml xml-serialization xmlserializer ixmlserializable

我的问题很简单。

想象一下,我们有一个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>

使用第二课:

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

使用第三类:

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

这样的东西就是我想要的,我不想在所有这些自定义XmlSerializer中实现,我的意思是标准序列化使用的默认值。

1 个答案:

答案 0 :(得分:1)

您需要在Foo<T>和T(使用where T : IXmlSerializable中实现IXmlSerializableFoo<T>中的实现将负责编写包含类型信息的包装元素(在WriteXml中)并在T上调用WriteXml,然后从类型信息(ReadXml)重新创建实例,并在T上调用ReadXml

StringDouble等基本类型不是IXmlSerializable,因此如果您想支持它们,则无法where T : IXmlSerializable。您还可以提供ReadXmlWriteXml的默认实施。这是有效的,因为您需要在致电Foo<T>之前创建ReadXml,强制您了解T

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);
    }
}