Зачем нужен атрибут [Serializable] и что он делает?

241
12 апреля 2017, 11:39

У всех классов, экземпляры которых должны/могут быть сохранены через BinaryFormater, обязан быть этот самый атрибут [Serializable]. Зачем он нужен?

Нет, конечно, ясно, что он говорит среде CLR, мол, тип есть сериализуемый, поэтому, будь добра (среда) и сериализируй!

В моем представлении, почти на пальцах, этот атрибут помогает MSV дописать и реализовать GetObjectData(SerializationInfo info, StreamingContext context) из интерфейса ISerializable для каждого поля в классе. Например, так:

    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Name", name);
        info.AddValue("BDate", BDate);
        info.AddValue("Price", Price);
    }

И реализовать конструктор для десериализации, вот так:

    public Engineer(SerializationInfo info, StreamingContext context) : base(info.GetString("Name"), info.GetDateTime("BDate"))
    {
        Price = info.GetDecimal("Price");
    }

НО, даже если и интерфейс ISerializable ты реализовал, то атрибут все равно нужен. CA2237: MarkISerializableTypesWithSerializable

Что же он все таки делает, так сказать, под капотом?

Answer 1

Поискав объяснения и как следует подумав, я окончательно укрепился в мнении, которое давно подозревал: этот атрибут служит намёком не столько BinaryFormatterу, сколько человеку. Не сериализуй что попало!

Например, при разработке на Windows Forms (когда вся логика в баттон-кликах, а данные - в полях форм) у новичков часто возникает соблазн сохранять внешний вид и вообще все данные программы с помощью сериализации главной формы. А что, просто же! Однако, если бы это было реализовано, то это привело бы к сохранению сотен, а то и тысяч, по большей части пустых (неизменённых с дефолтного значения) свойств форм со всеми вложенными контролами (в том числе изображения). Что, конечно же, избыточно и ненужно.

Соответственнно, когда разработчик пишет класс, содержащий поля/свойства с данными, он должен определить, можно ли (нужно ли) его свободно (де)сериализовать и пометить при необходимости этим атрибутом. Другой разработчик, использующий этот класс, по наличию/отсутствию атрибута поймёт, что с ним можно делать. При необходимости ему придётся создать класс, специально предназначенный для хранения отдельных (и только нужных!) данных.

READ ALSO
Object reference not set to an instance of an object XML document object c#

Object reference not set to an instance of an object XML document object c#

Xml-документ, необходимо воссоздать объект по его структуре

269
Экранирование запроса

Экранирование запроса

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

240
Cannot insert the OpenXmlElement “newChild” because it is part of a tree

Cannot insert the OpenXmlElement “newChild” because it is part of a tree

Добрый вечер уважаемые знатокиПодскажите где закралась ошибка

576
Нет доступа к папке Azure (ASP.NET MVC)

Нет доступа к папке Azure (ASP.NET MVC)

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

291