我正在使用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
属性的命名空间是从源代码命名空间生成的。
任何人都知道如何指定序列化时使用的命名空间?
答案 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; }
}
这似乎将正确的命名空间应用于集合类,而不是从源代码中获取命名空间。