Почему XmlSerializer не нуждается в типе, который будет помечен [Serializable]?

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

Есть ли какой-либо стандарт или шаблон о требованиях к сериализации?

Ответ 1

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

Ответ 2

Безопасность - это не единственная проблема; просто сериализация имеет смысл только для определенных классов. Например, он делает небольшую сериализацию для сериализации "соединения". Соединение строка, конечно, но само соединение? Неа. Аналогично, все, что требует неуправляемого указателя/дескриптора, не будет сериализоваться очень хорошо. Также не являются делегатами.

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

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

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

Ответ 3

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

  • XmlSerialization - По умолчанию работает с открытыми полями и свойствами. Все еще можно управлять с помощью XmlElementAttribute, XmlAttributeAttribute и т.д.
  • BinarySerialization - управляется атрибутом SerializationAttribute. Глубоко интегрирован в среду CLR.
  • Сериализация WCF - DataContractAttribute и т.д.

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