Почему я не должен делать класс Serializable?

Я храню некоторые объекты в своем представлении, и мне было интересно, есть ли недостатки в создании класса Serializable?

Неплохо ли делать все классы Serializable?

Ответ 1

Во-первых. Избегайте просмотра.

Обычно для передачи объектов используется сериализация (текстовая).

Вам следует избегать маркировки любого класса как сериализуемого, который не является объектом DTO (объект передачи данных) или классом сообщений. Мы делаем это по нескольким причинам. То, что когда-либо поднимает ваш класс в сериализованном формате, может не иметь информацию о методе (которая находится в исходной сборке) класса не DTO. Во-вторых, класс может ссылаться на ресурс (соединение с БД, дескриптор файла и т.д.). НЕ сериализуйте их, поскольку сериализация не восстанавливает соединения ресурсов и состояние, если явно не предназначено, но все еще плохая идея.

Итак, вкратце: НЕ сериализуйте, когда у вас есть контекстные методы и хранятся данные для сторонней стороны. (Как ответ службы с помощью методов - плохая идея). И НЕ сериализуйте, когда класс содержит ссылку на ресурс. Держите ваш сериализуемый объект чистым от методов как можно больше. Это может привести к небольшому перераспределению в шаблон типа службы.

Сделайте сериализацию DTO и сообщений.

Это скорее выбор дизайна.

Ответ 2

Маркировка как [Serializable] (или ISerializable) необходима для чего-либо, использующего BinaryFormatter, который вполне может включать в себя представление в конфигурации по умолчанию. Что касается хорошей и плохой практики... ну, большинство классов не нужно сериализовать, а IMO, даже если они есть, используя BinaryFormatter, не всегда лучший выбор *. И, в частности, обозначение его как [Serializable] и [DataContract] вызовет исключение IIRC.

* = на самом деле, IMO BinaryFormatter очень редко хороший выбор, но я могу быть предвзятым... и я намеренно не использую viewstate; p

Ответ 3

Хорошей практикой является создание всех классов, которые на самом деле являются Serializable как Serializable. Я бы просто использовал здравый смысл и установил его для тех классов, которые предназначены для пересечения границ процесса (классы DTO).

Итак, это те классы, которые:

  • Все их свойства - простые типы.
  • И если у них есть сложные свойства, сами их типы сериализуются