У всех классов, экземпляры которых должны/могут быть сохранены через 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
Что же он все таки делает, так сказать, под капотом?
Поискав объяснения и как следует подумав, я окончательно укрепился в мнении, которое давно подозревал: этот атрибут служит намёком не столько BinaryFormatter
у, сколько человеку. Не сериализуй что попало!
Например, при разработке на Windows Forms (когда вся логика в баттон-кликах, а данные - в полях форм) у новичков часто возникает соблазн сохранять внешний вид и вообще все данные программы с помощью сериализации главной формы. А что, просто же! Однако, если бы это было реализовано, то это привело бы к сохранению сотен, а то и тысяч, по большей части пустых (неизменённых с дефолтного значения) свойств форм со всеми вложенными контролами (в том числе изображения). Что, конечно же, избыточно и ненужно.
Соответственнно, когда разработчик пишет класс, содержащий поля/свойства с данными, он должен определить, можно ли (нужно ли) его свободно (де)сериализовать и пометить при необходимости этим атрибутом. Другой разработчик, использующий этот класс, по наличию/отсутствию атрибута поймёт, что с ним можно делать. При необходимости ему придётся создать класс, специально предназначенный для хранения отдельных (и только нужных!) данных.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Xml-документ, необходимо воссоздать объект по его структуре
Есть проблема с экранированием названий столбцовЕсли я хочу сделать название столбца на русском то в запросе я должен это название заключить...
Добрый вечер уважаемые знатокиПодскажите где закралась ошибка
У меня есть веб-приложение, которое записывает видеофайлы в папку внутри проекта