Wrapper Collection的IXmlSerializable命名空间

时间:2013-04-24 15:56:05

标签: c# xml xml-serialization datacontractserializer

我正在使用DataContractSerializer界面使用IXmlSerializable进行一些自定义序列化。

例如:

public class CustomPartOfAContract : IXmlSerializable
{
    public void WriteXml( XmlWriter writer )
    {
        //...
    }

    public void ReadXml( XmlReader reader )
    {
        //...
    }
}

[DataContract(Namespace="http://mynamespace.com")]
public class MyDataContract
{
    [DataMember(IsRequired=true)]
    public ICollection<CustomPartOfAContract> CustomParts { get; set; }

}

现在,在WriteXml方法中,我可以告诉XmlWriter我写的每个元素使用什么命名空间。但是我无法弄清楚如何为CustomPartOfAContract指定命名空间。

将XML输出到文件,CustomPartsMyDataContract属性的命名空间是从源代码命名空间生成的。

任何人都知道如何指定序列化时使用的命名空间?

1 个答案:

答案 0 :(得分:0)

好的,我通过添加一个自定义集合类来解决这个问题,该类继承自Collection并将[CollectionDataContract]属性应用于正确的命名空间:

[CollectionDataContract( Namespace="http://mynamespace.com" )]
public class MyCustomPartsCollection : Collection<CustomPartOfAContract>
{
    public MyCustomPartsCollection()
    {
        // We need a default constructor or the serializer complains.
    }
}

然后在我的数据合同中使用它:

[DataContract(Namespace="http://mynamespace.com")]
public class MyDataContract
{
    [DataMember(IsRequired=true)]
    public MyCustomPartsCollection CustomParts { get; set; }

}

这似乎将正确的命名空间应用于集合类,而不是从源代码中获取命名空间。