Как реализовать сериализацию XML для пользовательских типов? - PullRequest
2 голосов
/ 02 октября 2009

У меня есть несколько типов, которые я хочу сериализовать / десериализовать и генерировать пользовательский интерфейс на основе выбранного объекта. Пользовательский интерфейс также изменит объект, который, в свою очередь, придется сериализовать, чтобы сохранить его в моем приложении.

Итак:

[obj_apple stored in the app] -> select obj_apple -> deserialize -> show in UI -> use the UI to change obj_apple -> deselect obj_apple -> serialize -> [obj_apple stored in the app]

Объекты должны быть сериализованы / десериализованы, и эти данные должны быть строковыми. Вот почему я подумал, что лучше иметь сериализатор xml.

Какой тип сериализатора будет лучшим? И есть ли хорошие примеры для реализации этого для пользовательских типов?

Ответы [ 2 ]

2 голосов
/ 02 октября 2009

DataContractSerializer весь день.

1 голос
/ 02 октября 2009

У вас есть несколько вариантов для строк; xml, что можно сделать просто с помощью XmlSerializer (или DataContractSerializer, но это дает гораздо меньший контроль над XML) или JSON (JSON.net и т. д.).

Типичные классы для XmlSerializer будут выглядеть просто так:

public class Apple {
    public string Variety {get;set;}
    public decimal Weight {get;set;}
    // etc
}

(заметьте, я ожидаю, что вышеприведенное также будет работать на JSON.net)

Вышеуказанный класс также должен нормально работать в сценариях привязки данных и т. Д. Благодаря свойствам.

Вы бы сериализовали это:

    Apple obj = new Apple { Variety = "Cox", Weight = 12.1M};
    XmlSerializer ser = new XmlSerializer(typeof(Apple));

    StringWriter sw = new StringWriter();
    ser.Serialize(sw, obj);
    string xml = sw.ToString();

    StringReader sr = new StringReader(xml);
    Apple obj2 = (Apple)ser.Deserialize(sr);

но вы можете настроить xml:

[XmlType("apple"), XmlRoot("apple")]
public class Apple {
    [XmlAttribute("variety")]
    public string Variety {get;set;}
    [XmlAttribute("weight")]
    public decimal Weight {get;set;}
    // etc
}

DataContractSerializer это в идеале больше похоже на:

[DataContract]
public class Apple {
    [DataMember]
    public string Variety {get;set;}
    [DataMember]
    public decimal Weight {get;set;}
}
...