0

我正在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 输出到文件中,CustomParts属性的命名空间MyDataContract是从源代码命名空间生成的。

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

4

1 回答 1

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

}

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

于 2013-04-25T08:36:14.443 回答