Почему вы должны пометить класс атрибутом [serializable]? - PullRequest
14 голосов
/ 07 апреля 2010

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

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

Ответы [ 6 ]

24 голосов
/ 07 апреля 2010

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

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

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

16 голосов
/ 07 апреля 2010

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

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

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

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

2 голосов
/ 07 апреля 2010

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

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

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

2 голосов
/ 07 апреля 2010

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

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

2 голосов
/ 07 апреля 2010

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

0 голосов
/ 27 ноября 2010

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

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

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

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