Десериализовать XML в IList c # - PullRequest
3 голосов
/ 14 марта 2012

Я пытаюсь десериализовать некоторые xml в IList, но у меня проблемы. Это то, что я сделал до сих пор:

XML:

<?xml version="1.0" encoding="utf-8"?>

<Animals>
    <Animal>
        <Name>Cow</Name>
        <Color>Brown</Color>
    </Animal>
</Animals>

Модель:

[XmlRoot("Animals")]
public class Model
{
    [XmlElement("Animal")]
    public IList<Animal> AnimalList { get; set; }
}

public class Animal
{
    [XmlElement("Name")]
    public string Name{ get; set; }
    [XmlElement("Color")]
    public string Color{ get; set; }
}

Десериализация:

FileStream fs = new FileStream("file.xml", FileMode.Open);
XmlReader xml = XmlReader.Create(fs);

XmlSerializer ser = new XmlSerializer(typeof(List<Model>));

var list = (List<Model>)ser.Deserialize(xml);

Я получаю недопустимое исключение при выполнении кода выше. Что я делаю не так?

Спасибо, Джеймс Форд

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

Попробуйте это:

// Create a new XmlSerializer instance with the type of the test class
XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Model>));

// Create a new file stream for reading the XML file
FileStream ReadFileStream = new FileStream(@"C:\file.xml", FileMode.Open, FileAccess.Read, FileShare.Read);

// Load the object saved above by using the Deserialize function
List<Model> LoadedObj = (List<Model>)SerializerObj.Deserialize(ReadFileStream);

// Cleanup
ReadFileStream.Close();
3 голосов
/ 14 марта 2012

Я думаю, вам нужно изменить свой XmlSerializer на следующее:

XmlSerializer ser = new XmlSerializer(typeof(Model));

Прежде чем пытаться сериализовать список моделей, вы хотите сериализовать файл XML в модель., который содержит список вещей.

Также вам нужно изменить определение ObjectList на

public List<Animal> AnimalList { get; set; }

3 голосов
/ 14 марта 2012

Проблема в том, что вы используете IList<Animal>. Вам нужно использовать List<Animal>, чтобы он знал, какой тип использовать.

РЕДАКТИРОВАТЬ: Использование следующего кода в LINQPad работает отлично. Разница лишь в том, что я загружаю XML через строку вместо файла, но даже когда я перехожу на файл, он работает нормально. Я только что добавил использование для System.Xml.Serialization.

void Main()
{
    string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <Animals>
        <Animal>
            <Name>Cow</Name>
            <Color>Brown</Color>
        </Animal>
    </Animals>";

    XmlReader reader = XmlReader.Create(new StringReader(xml));

    XmlSerializer ser = new XmlSerializer(typeof(Model));

    var list = (Model)ser.Deserialize(reader);
    list.Dump();
}

// Define other methods and classes here
[XmlRoot("Animals")]
public class Model
{
    [XmlElement("Animal")]
    public List<Animal> AnimalList { get; set; }
}

public class Animal
{
    [XmlElement("Name")]
    public string Name{ get; set; }
    [XmlElement("Color")]
    public string Color{ get; set; }
}
...