2015-09-30 2 views
1

Я пытаюсь Deserialize файл XML, который выглядит следующим образомDeserialize с помощью DataContractSerializer

<?xml version="1.0"?> 
 
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication6"> 
 
    <values> 
 
    <String>Value 1</String> 
 
    <String>Value 2</String> 
 
    </values> 
 
</Test>

к объекту, который это

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/ConsoleApplication6")] 
public class Test 
{ 
    [DataMember(Name = "values")] 
    public String[] values; 
} 

с

var ds = new DataContractSerializer(typeof(Test)); 
     using (Stream stream1 = File.OpenRead(@"C:\Projects\test1.xml")) 
     { 

      Test rr = (Test)ds.ReadObject(stream1); 
     } 

Однако ни одно из значений не является десериализацией. Я просто вижу и пустую массив в Test rr. Не могли бы вы рассказать, что я делаю неправильно. Заранее спасибо.

ответ

1

Если вам нужен хороший контроль в XML, который испускается при сериализации, вы не должны использовать DataContractSerializer. Он имеет очень ограниченную гибкость. Вам было бы лучше использовать XmlSerializer, который также имеет лимитирования, но гораздо более гибкий, чем DataContractSerializer.

Это, как вы можете сделать то, что вы хотите, с DataContractSerializer.

Измените пространство имен по умолчанию на свой xml, чтобы использовать тот, который DataContractSerializer использует по умолчанию.

<?xml version="1.0"?> 
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/"> 
    <values> 
    <String>Value 1</String> 
    <String>Value 2</String> 
    </values> 
</Test> 

Вместо того, чтобы использовать string[] создать свой собственный тип, производный от List<string>. Это должно быть сделано исключительно для того, чтобы повесить CollectionDataContractAttribute. CollectionDataContractAttribute - это то, что позволит вам указать имя элементов внутри <values>.

[DataContract] 
public class Test 
{ 
    [DataMember(Name = "values")] 
    public TestValues values; 

} 

[CollectionDataContract(ItemName = "String")] 
public class TestValues : List<string> { } 
+0

большое спасибо. ваше решение отлично работало. – IamaC

1

DataContractSerializer имеет свои собственные правила для XML и не может поддерживать все формы XML. Я предлагаю использовать XmlSerializer.

Используйте это определение

[XmlClass(Namespace = "http://schemas.datacontract.org/2004/07/ConsoleApplication6")] 
public class Test 
{ 
    [XmlArray("values")] 
    [XmlArrayItem("String")] 
    public String[] values; 
} 
+0

Лично мне нравится XmlSerializer над DataContractSerializer. Однако я не могу использовать XmlSerializer в своем проекте для некоторых других ограничений. Спасибо за ваш ответ. – IamaC

Смежные вопросы