2013-04-24 2 views
0

Я делаю некоторые пользовательские сериализации с DataContractSerializer через использование интерфейса IXmlSerializable.IXmlSerializable пространство имен коллекции Wrapper

Например:

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

Хорошо, я решил это путем добавления пользовательского класса коллекции, который наследуется от 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; } 

} 

Это похоже на правильное пространство имен в классе коллекции, а не на использование пространства имен из исходного кода.