C# XML-сериализация/десериализация

Я новичок в С#. Я беру курс на это прямо сейчас, и один из наших примеров класса не будет компилироваться. Visual Studio 2010 выдает мне эту ошибку: в XML-документе есть ошибка (3, 2).

Как мне отредактировать файл XML, чтобы он работал с кодом?

Спасибо за помощь!

public class SerializeIn
{
    public static void Main()
    {
        // Declarations.
        Person[] p = new Person[0];
        string infile = "Persons.xml";
        StreamReader sr = new StreamReader(infile);
        XmlSerializer xs = new XmlSerializer(p.GetType());

        // Deserialize Person object from disc.
        p = (Person[])(xs.Deserialize(sr));

        // Close StreamReader object to be safe.
        sr.Close();

        // Write what happened.
        Console.WriteLine("Deserialized array p from output file " +
            infile + ".");

        // Print array.
        foreach(Person x in p)
            Console.WriteLine(x);

        Console.ReadLine();
    }
}

с помощью системы; namespace XmlArraySerialize { /// /// XmlArraySerialize Пример: сериализует и десериализует /// массив Person. ///

public class Person
{
    public string name;
    public string gender;
    public int age;

    // Noarg constructor needed for compatibility
    public Person() { }

    public Person(string theName, string theGender, int theAge)
    {
        name = theName;
        gender = theGender;
        age = theAge;
    }

    public override string ToString()
    {
        return name + " " + gender + " " + age;

    }
}

}

И XML-файл...

<?xml version="1.0" standalone="no"?>
<!--Created by ToXml Example in IO-->
<Persons>
    <Person ID="1001">
        <Name>Susan</Name>
        <Gender>F</Gender>
        <Age>21</Age>
    </Person>
    <Person ID="1002">
        <Name>Michael</Name>
        <Gender>M</Gender>
        <Age>25</Age>
    </Person>
    <Person ID="1003">
        <Name>Judy</Name>
        <Gender>F</Gender>
        <Age>31</Age>
    </Person>
    <Person ID="1004">
        <Name>Chloe</Name>
        <Gender>F</Gender>
        <Age>27</Age>
    </Person>
    <Person ID="1005">
        <Name>Scott</Name>
        <Gender>M</Gender>
        <Age>58</Age>
    </Person>
    <Person ID="1006">
        <Name>William</Name>
        <Gender>M</Gender>
        <Age>41</Age>
    </Person>
    <Person ID="1007">
        <Name>Mary</Name>
        <Gender>F</Gender>
        <Age>30</Age>
    </Person>
</Persons>

person Taj G    schedule 19.11.2010    source источник
comment
Можете ли вы также опубликовать код для класса Person? Более того, вы упомянули, что это ошибка компиляции, но я не думаю, что VS будет беспокоить ваш XML-файл, куда вы поместили XML-файл? Его не следует включать в проект VS (по крайней мере, не нужно компилировать).   -  person xandy    schedule 19.11.2010
comment
Хорошо, отредактировано, чтобы включить класс Person. Файл XML находится только в папке /bin/debug.   -  person Taj G    schedule 19.11.2010
comment
stackoverflow.com/questions/10109608/ В этом сообщении есть решение.   -  person Savaratkar    schedule 25.03.2013


Ответы (2)


Это должно сработать)

class Program
{
    static void Main(string[] args)
    {   
        const string infile = "x:\\Persons.xml";
        Persons p;

        using (var sr = new StreamReader(infile))
        {
            var xs = new XmlSerializer(p.GetType());
            p = (Persons)(xs.Deserialize(sr));
        }

        Console.WriteLine("Deserialized array p from output file " + infile + ".");

        // Print array.
        foreach (var x in p)
            Console.WriteLine(x);

        Console.ReadLine();
    }
}

[XmlType(TypeName = "Persons")]
public class Persons : IEnumerable<Person>
{
    private List<Person> inner = new List<Person>();

    public void Add(object o)
    {
        inner.Add((Person)o);
    }

    public IEnumerator<Person> GetEnumerator()
    {
        return inner.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}


public class Person
{
    [XmlAttribute]
    public int ID { get; set; }

    public string Name { get; set; }
    public string Gender { get; set; }
    public int Age { get; set; }
}

Подробнее о XmlType, Подробнее о XmlAttribute

person The Smallest    schedule 19.11.2010
comment
Привет, спасибо за ответ! Мне интересно, есть ли способ просто отредактировать файл XML, чтобы он загружался правильно? - person Taj G; 19.11.2010
comment
@Taj G, я не вижу простого способа отредактировать XML, чтобы он загружался. В вашем коде нет ссылки на что-либо с именем Persons, и именно здесь вы получаете ошибку времени выполнения. После этого в вашем коде нет ничего для атрибута ID в файле XML. Вам нужны некоторые изменения кода, чтобы заставить его работать. - person Jason; 19.11.2010

Спасибо за ваш вклад! Я решил проблему. Так как в коде нет метода main, то пришлось редактировать свойства, чтобы SerializeOut работал раньше, чем SerializeIn. Я предполагаю, что XML-файл Persons — это просто шаблон... Еще раз спасибо!

person Taj G    schedule 19.11.2010