2014-03-18 5 views
1

Я знаю, что это довольно глупый вопрос, но я застрял ... (подобный вопрос, не имеющий полезный ответ here)десериализации простой XML в список <string>

мой XML является

<Param> 
    <MyList> 
     <mynode>aaa</mynode> 
     <mynode>bbb</mynode> 
     <mynode>ccc</mynode> 
     <mynode>ddd</mynode> 
    </MyList> 
</Param> 

и я есть класс, как этот

public class MyClass 
{ 
    [XmlArray("MyList")] 
    [XmlArrayItem("mynode")] 
    public List<string> MyList { get; set; } 
} 

, но когда я пытаюсь десериализации я получаю nullerrorexception

Почему это не работает?

редактировать: Код Deserialize:

public static Param InitConfig(string Path) 
{ 
    XmlRootAttribute xRoot = new XmlRootAttribute(); 
    xRoot.ElementName = "Param"; 
    xRoot.IsNullable = true; 

    XmlSerializer serializer = new XmlSerializer(typeof(Param), xRoot); 
    using (StreamReader reader = new StreamReader(Path)) 
    { 
     return (Param)serializer.Deserialize(reader); 
    } 
} 

и

public class Param 
{ 
    public MyClass MyClass {get; set;} 
} 

(на самом деле более сложная)

+0

Так что не работает? Какая ошибка? Что пошло не так? – leppie

+0

Попробуйте заполнить класс примерами данных и сериализовать это - тогда вы увидите, что ожидает десериализация в качестве ввода. –

+0

Не могу прикоснуться к файлу xml ... Мне нужно выяснить, как десериализовать эту структуру в списке Doc

ответ

3

Не видя код, который на самом деле делает сериализацию это трудно найти баг. Тем не менее, вы можете попробовать говорить сериалайзер, что это верхний элемент XML:

[XmlRoot("Param")] 
public class MyClass 
{ 
    [XmlArray("MyList")] 
    [XmlArrayItem("mynode")] 
    public List<string> MyList { get; set; } 
} 

EDIT: сериализатора должен быть типа MyClass:

public static Param InitConfig(string Path) 
{ 
    XmlRootAttribute xRoot = new XmlRootAttribute(); 
    xRoot.ElementName = "Param"; 
    xRoot.IsNullable = true; 

    XmlSerializer serializer = new XmlSerializer(typeof(MyClass), xRoot); 
    using (StreamReader reader = new StreamReader(Path)) 
    { 
     return new Param {MyClass = (MyClass)serializer.Deserialize(reader)}; 
    } 
} 
+1

+1 буквально публиковал тот же ответ. – James

+1

это не скомпилируется. Атрибут 'XmlElement' не может быть применен к 'class' –

+0

добавлен десериализованный код в вопрос :) – Doc

1

Вы должны использовать XmlRoot атрибут с MyClass как это:

[XmlRoot("Param")] 
public class MyClass 
{ 
    [XmlArray("MyList")] 
    [XmlArrayItem("mynode")] 
    public List<string> MyList { get; set; } 
} 

Затем вы можете использовать этот код для Deserialize йо ур XML:

XmlSerializer se = new XmlSerializer(typeof(MyClass)); 
using(var stream = File.OpenRead("filePath")) 
{ 
    var myClass = (MyClass) se.Deserialize(stream); 
} 
0

Это было бы одно решение

 XmlSerializer rializer = new XmlSerializer(typeof(MyClass)); 

     using (var stream = File.OpenRead("C:\\Users\\t0408\\Desktop\\testfor.xml")) 
     { 
      MyClass myClass = (MyClass)rializer.Deserialize(stream); 
     } 

// Класс должен быть, как это

 [XmlRoot("Param")] 
     public class MyClass 
     { 
      [XmlArrayItem("mynode")] 
      public List<string> MyList { get; set; } 
     } 

Благодарности Lineesh

+0

не работает, извините ... – Doc

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