Требует ли XML-сериализация свойств для чтения/записи?

Я тестирую сериализацию XML в своем классе, но заметил, что идентификационный номер не сохраняется при запуске программы.

Итак, я осмотрелся и изменил несколько вещей, но ничего не сработало, затем я увидел, что все поля, кроме ID, имеют как свойства get, так и set. Поэтому я добавил набор; собственности на мой идентификационный номер и пуф, это сработало. Вопрос в том, нужно ли его устанавливать; и получить; для всех моих свойств, чтобы сериализация XML работала?

Я не хочу, чтобы идентификационный номер изменялся после создания объекта (он генерируется автоматически).


person Patrick    schedule 20.07.2009    source источник


Ответы (2)


Да, это в основном ограничение сериализации XML. Из документов по XML-сериализации:

Только общедоступные свойства и поля могут быть сериализованы. Свойства должны иметь общедоступные методы доступа (методы get и set). Если вам необходимо сериализовать закрытые данные, используйте класс BinaryFormatter, а не сериализацию XML.

XML-сериализация не так гибка, как хотелось бы.

person Jon Skeet    schedule 20.07.2009
comment
Я заметил, что он не упомянул, какую версию фреймворка он использовал. Разве это не изменилось в .NET 3.5? - person Justin Niessner; 20.07.2009
comment
Хотя это может быть дословная цитата из MSDN, я бы не обязательно рекомендовал BinarySerializer в качестве альтернативы для тех сценариев, где xml был предыдущим вариантом... - person Marc Gravell; 20.07.2009

Обратите внимание, что если вы хотите сериализовать непубличные данные в виде xml, может оказаться полезным DataContractSerializer. Он не такой гибкий, как XmlSerializer (и вы не можете указать атрибуты), но он может сериализовать закрытые данные:

[DataContract]
public class Person {
    [DataMember]
    private int id;

    public int Id {get {return id;}} // immutable

    public Person(int id) { this.id = id; }

    [DataMember]
    public string Name {get;set;} // mutable
}

Также обратите внимание, что он не использует ваш конструктор... или даже любой конструктор - он обманывает, позволяя создать объект и впоследствии заполнить данные.

person Marc Gravell    schedule 20.07.2009