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>

使用第二类:

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

使用第三类:

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

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

4

1 回答 1

1

您需要在和 T中实现IXmlSerializable (使用。然后,实现 in将负责编写带有类型信息的包装器元素(在WriteXml中)并调用T,并根据类型信息(在ReadXml中)重新创建实例和打电话给T。Foo<T>where T : IXmlSerializableFoo<T>WriteXmlReadXml

基本类型 likeStringDoubleis not IXmlSerializable,所以where T : IXmlSerializable如果你想支持它们就不能拥有。您还可以提供ReadXml和的默认实现WriteXml。这是可行的,因为您需要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);
    }
}
于 2012-05-04T04:38:03.850 回答