Почему XmlSerializer не нужно, чтобы тип был помечен как [Serializable]? - PullRequest
15 голосов
/ 25 декабря 2008

В C #, если я хочу сериализовать экземпляр с XmlSerializer, тип объекта не должен быть отмечен атрибутом [Serializable]. Однако для других подходов сериализации, таких как DataContractSerializer, необходимо, чтобы класс был помечен как [Serializable] или [DataContract].

Существует ли какой-либо стандарт или шаблон в отношении требований сериализации?

Ответы [ 3 ]

16 голосов
/ 25 декабря 2008

Это потому, что XmlSerializer сериализует только открытые поля / свойства. Другие формы сериализации могут сериализовать личные данные, которые представляют потенциальную угрозу безопасности, поэтому вы должны «выбрать» использование атрибута.

8 голосов
/ 26 декабря 2008

Безопасность - не единственная проблема; просто сериализация имеет смысл только для определенных классов. Например, он делает маленький snse для сериализации «соединения». Соединение строка , конечно, но само соединение? Неа. Аналогично, все, что требует неуправляемого указателя / дескриптора, не будет очень хорошо сериализовано. Ни делегаты.

Кроме того, XmlSerializer и DataContractSerializer (по умолчанию) являются сериализаторами tree , а не сериализаторами graph - поэтому любые рекурсивные ссылки (например, Parent) приведут к сломаться.

Маркировка класса предпочтительным токеном сериализатора - это просто способ сказать "и это должно иметь смысл".

IIRC, оба [XmlSerializer и [DataContractSerializer] использовали , чтобы быть очень жесткими относительно требовательных вещей, таких как [Serializable], [DataContract] или [IXmlSerializable], но они стали немного либеральнее в последнее время.

3 голосов
/ 25 декабря 2008

В настоящее время в .Net Framework действительно есть 3 формы сериализации.

  1. XmlSerialization - по умолчанию работает с открытыми полями и свойствами. Может по-прежнему управляться через XmlElementAttribute, XmlAttributeAttribute и т. Д. ...
  2. BinarySerialization - Управляется атрибутом Serialization. Глубоко интегрированный в CLR
  3. Серализация WCF - DataContractAttribute и т. Д. *

К сожалению, существует стандартный общий шаблон для сериализации. Все 3 фреймворка имеют разные требования и особенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...