Почему вы должны пометить класс атрибутом [serializable]?
Видя, как вы можете преобразовать любой документ в массив байтов и сохранить его на диск, а затем перестроить файл в его исходную форму (если у вас есть метаданные для имени файла и т.д.).
Зачем вам отмечать класс с помощью [Serializable]
и т.д.? Это только та же идея, информация о метаданных, поэтому, когда вы бросаете объект в свой класс, вещи правильно отображаются?
Ответы
Ответ 1
Во-первых, вам не нужно.
Это просто интерфейс маркера который сообщает сериализатору, что класс состоит из элементов, которые он может сериализовать (что может быть или не быть true), и это может использовать сериализацию по умолчанию.
XMLSerializer
имеет дополнительное требование о том, чтобы в класс был создан конструктор нулевых параметров.
Существуют и другие сериализаторы, которые используют контракты для сериализации (например, DataContractSerializer
) - они дают вам больше контроля над сериализацией, чем просто маркирование класс Serializable
. Вы также можете получить больше контроля, реализовав интерфейс ISerializable
.
Ответ 2
Двоичная сериализация довольно мощная, она может создать экземпляр класса без запуска конструктора и может устанавливать поля в вашем классе, которые вы объявили приватными. Обычный код, конечно, не может этого сделать. Применяя атрибут [Serializable], вы явно даете ему возможность работать с вашими частями. И вы неявно даете это разрешение только классу BinaryFormatter.
Сериализация XML не нуждается в таком виде, она только сериализует публичные члены.
DataContractSerializer может также сериализовать и закрытых членов. Поэтому он нуждается в явном одобрении снова, теперь с атрибутом [DataContract].
Ответ 3
Он указывает сериализатору, что вы хотите, чтобы этот класс был сериализован, поскольку вы можете не сериализовать все свойства или классы.
Ответ 4
В основном это метаданные, которые указывают, что класс может быть сериализован, и ничего более.
Требуется множество сериализаторов структуры, которые отказываются обрабатывать типы, не применяя к ним этот атрибут.
Ответ 5
Сериализация может создавать дыры в безопасности и может страдать от проблем с версиями. Кроме того, для некоторых классов сама идея сериализации - полная глупость.
Подробнее см. в замечательных ответах на Почему Java требуется интерфейс Serializable?, особенно этот, этот, а этот. Они делают так, что сериализация должна быть функцией, которую вы должны явно выбрать.
Для контрапункта принятый ответ на этот вопрос делает случай, когда классы должны быть сериализуемыми по умолчанию.
Ответ 6
Я вижу это как напоминание о том, что я разрешу сериализацию класса. Поэтому вы не подразумеваете сериализацию чего-то, чего не следует.
Не знаю, это намерение дизайнеров.
Кстати, я просто люблю BinaryFormatter
и использую его как можно больше. Он обрабатывает большую часть материала автоматически (например, перестраивает сложные графы объектов с повторяющимися ссылками, распространяющимися по всему графику).