Почему необходимо отметить класс с [сериализуемым] атрибутом?

Наблюдение, поскольку можно преобразовать любой документ массиву байтов и сохранить его на диск и затем восстановить файл к его исходной форме (как долго, поскольку у Вас есть метаданные для его имени файла и т.д.).

Почему необходимо отметить класс с [Serializable] и т.д.? Это - просто та же идея, информация о типе "метаданных" поэтому при кастинге объекта к его вещам класса, отображается правильно?

15
задан Daniel 18 August 2014 в 07:13
поделиться

5 ответов

Во-первых, у вас нет .

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

XMLSerializer имеет дополнительное требование - иметь конструктор с нулевым параметром для класса.

Существуют и другие сериализаторы, которые используют контракты для сериализации (например, DataContractSerializer ) - они дают вам больше контроля над сериализацией, чем просто пометка класса как Serializable . Вы также можете получить больше контроля, реализовав интерфейс ISerializable .

17
ответ дан 1 December 2019 в 00:26
поделиться

Это в основном метаданные, которые указывают, что класс может быть сериализован, не более того.

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

2
ответ дан 1 December 2019 в 00:26
поделиться

Сериализация может создать бреши в безопасности и может вызвать проблемы с версией. Вдобавок ко всему, для некоторых классов сама идея сериализации - полная чушь.

Подробнее см. В отличных ответах на Зачем Java нужен сериализуемый интерфейс? , особенно этот , этот и этот . Они утверждают, что сериализация должна быть функцией, которую вы должны явно выбрать.

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

2
ответ дан 1 December 2019 в 00:26
поделиться

Он указывает сериализатору, что вы хотите, чтобы этот класс был сериализован, поскольку вы можете не захотеть сериализовать все свойства или классы.

2
ответ дан 1 December 2019 в 00:26
поделиться

Двоичная сериализация является довольно мощным средством, она может создавать экземпляр класса без запуска конструктора и может устанавливать поля в вашем классе, которые вы объявили частными. Обычный код, конечно, не может этого сделать. Применяя атрибут [Serializable], вы явно даете ему добро на то, чтобы возиться с вашими частными частями. И вы неявно даете это разрешение только классу BinaryFormatter.

Сериализация XML не требует такого разрешения, она сериализует только те члены, которые являются общедоступными.

DataContractSerializer также может сериализовать частные члены. Поэтому ему снова требуется явное подтверждение, теперь с атрибутом [DataContract].

25
ответ дан 1 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: