Почему вы должны пометить класс атрибутом [serializable]?

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

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

Ответ 1

Во-первых, вам не нужно.

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

XMLSerializer имеет дополнительное требование о том, чтобы в класс был создан конструктор нулевых параметров.

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Я вижу это как напоминание о том, что я разрешу сериализацию класса. Поэтому вы не подразумеваете сериализацию чего-то, чего не следует.

Не знаю, это намерение дизайнеров.

Кстати, я просто люблю BinaryFormatter и использую его как можно больше. Он обрабатывает большую часть материала автоматически (например, перестраивает сложные графы объектов с повторяющимися ссылками, распространяющимися по всему графику).