Добавьте XmlAttribute в класс C# для сериализации

У меня тут немного голова чешется, так как я думаю, что делаю это правильно! Мне нужно создать файл xml, как показано ниже (я не учел объявления пространства имен)

<races> <race racename="race one"> <horse> <name>Silver</name> <age>6</name> </horse> </race> </races>

Классовые скачки — это совокупность классовых скачек, а классовые скачки — это совокупность классовых лошадей. Ниже приведен соответствующий код для гоночного класса, который у меня есть и вызывает проблему (по крайней мере, я так думаю).

[Serializable]
[XmlType("race")]
public class Race : CollectionBase
{
    private string _raceName;        

    [XmlAttribute("racename")]
    public string RaceName
    {
        get
        {
            return this._raceName;
        }
        set
        {
            this._raceName = value;
        }
    }

У меня есть файл xml, как и ожидалось, ЗА ИСКЛЮЧЕНИЕМ, что атрибут racename не сериализуется. Он определенно присваивается объекту гонки перед сериализацией. Есть предположения? Я, очевидно, где-то что-то упустил, но я не уверен, как бы я даже проверил, где это терпит неудачу. Любая помощь будет принята с благодарностью!

Эоин.


person Eoin Melly    schedule 28.03.2015    source источник
comment


Ответы (2)


В классах, реализующих IEnumerable, сериализуются только коллекции, а не общедоступные свойства.

Используйте коллекцию Horse внутри класса Race и удалите :CollectionBase

[Serializable]
[XmlType("race")]
public class Race
{
    [XmlElement("horse")]
  public  List<Horse> Horses { get; set; }


    [XmlAttribute("racename")]
    public string RaceName
    {
        get;

        set;

    }
    public Race()
    {
        Horses = new List<Horse>();
    }
}

Результат

<race xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" racename="race one">
 <horse>
  <Name>Silver</Name>
  <Age>6</Age>
 </horse>
</race>
person The One    schedule 28.03.2015
comment
Благодаря JAT, впоследствии я узнал, что xmlserializer действительно игнорирует свойства в классах, которые наследуются от collectionbase. В конце концов я создал класс datacontainer для хранения объекта гонки и передал ему свойство racename, так как мне нужно, чтобы каждая гонка также содержалась в коллекции рас! Расы — это корень файла xml. Однако класс datacontainer выглядит неуклюжим как решение, но я открыт для любых предложений по более чистому способу собрать все это вместе! - person Eoin Melly; 29.03.2015

Я предлагаю вам создать тестовое консольное приложение в решении и протестировать код, подобный этому http://pastebin.com/bP340WmR если он работает нормально, создайте коллекцию объектов и попробуйте сериализовать. Выполнение этого шаг за шагом поможет понять, где именно проблема.

person Yuriy Gavriluk    schedule 28.03.2015