Почему Serializable Attribute требуется для сериализации объекта - PullRequest
36 голосов
/ 06 июня 2010

Насколько я понимаю, SerializableAttribute не обеспечивает проверки времени компиляции, поскольку все это делается во время выполнения. Если это так, то почему необходимо, чтобы классы были помечены как сериализуемые?

Не мог ли сериализатор просто попытаться сериализовать объект и затем потерпеть неудачу? Разве это не то, что он делает сейчас? Когда что-то помечено, оно пытается и терпит неудачу. Разве не было бы лучше, если бы вы отмечали вещи как не сериализуемые, а не сериализуемые? Таким образом, у вас не будет проблемы с библиотеками, не помечающими вещи как сериализуемые?

Ответы [ 2 ]

40 голосов
/ 06 июня 2010

Насколько я понимаю, идея SerializableAttribute заключается в создании opt-in системы для двоичной сериализации.

Имейте в виду, что в отличие от XML-сериализации, которая используетпубличные свойства, двоичная сериализация захватывает все приватные поля по умолчанию.

Мало того, что это может включать в себя структуры операционной системы и частные данные, которые не должны быть предоставлены, но десериализация это может привестиповрежденное состояние, которое может привести к сбою приложения (глупый пример: дескриптор файла, открытого на другом компьютере).

20 голосов
/ 06 июня 2010

Это только требование для BinaryFormatter (и эквивалент SOAP, но никто не использует его). Диего прав; для этого есть веские причины с точки зрения того, что он делает, но это далеко от единственного варианта - действительно, лично я только рекомендую BinaryFormatter для разговора между AppDomains - не (IMO) - хороший способ сохранить данные (на диск, в кэш, в BLOB-базу данных и т. д.).

Если это поведение вызывает у вас проблемы, рассмотрите возможность использования любой из альтернатив:

  • XmlSerializer, который работает с открытыми членами (не только с полями), но требует открытого конструктора без параметров и открытого типа
  • DataContractSerializer, который может работать полностью opt-in (с использованием [DataContract] / [DataMember]), но который также (в 3.5 и выше) может работать вместо полей вместо

Также - для стороннего варианта (я являюсь третьим лицом); у protobuf-net здесь могут быть опции; «v2» (еще не полностью выпущен, но доступен как источник) позволяет описывать модель (какие элементы сериализуются и т. д.) независимо от типа, чтобы ее можно было применять к типам, которые вы не контролируете. И, в отличие от BinaryFormatter, выходные данные зависят от версии, общедоступного формата и т. Д.

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