#.net #serialization #reference #binaryformatter
#.net #сериализация #ссылка #двоичный форматировщик
Вопрос:
Учитывая следующую структуру класса, будет ли Bar сериализован / десериализован, как ожидалось?
public class Foo { int x; string y; }
[Serializable]
public class Bar {
Foo[] AllFoos;
Foo SelectedFoo;
public Bar(Foo[] allFoos, int selectedFooIndex) {
this.AllFoos = allFoos;
this.SelectedFoo = allFoos[selectedFooIndex];
}
}
Мне любопытно узнать о нескольких вещах:
1) Требует ли BinaryFormatter, чтобы класс Bar был оформлен атрибутом [Serializable] или реализовывал интерфейс ISerializable?
2) Должен ли класс Foo также быть оформлен атрибутом [Serializable]?
3) Если строка просто украшена атрибутом [Serializable], будет поле Bar.SelectedFoo правильно сохраняет свою ссылку на массив? или я получу копию этого Foo?
Ответ №1:
1) Требует ли двоичное форматирование, чтобы класс Bar был оформлен атрибутом [Serializable] или реализовывал интерфейс ISerializable?
Да, это так, если двоичный формататор должен использоваться для сериализации экземпляра Bar.
2) Должен ли класс Foo также быть оформлен атрибутом [Serializable]?
Да, если только вы не создадите пользовательский механизм сериализации, который не включает сериализацию экземпляра объекта Foo. Например, вы могли бы сериализовать компоненты x и y отдельно и создать из них новый экземпляр Foo в коде десериализации. В противном случае у него должен быть атрибут или интерфейс.
3) Если строка просто украшена атрибутом [Serializable], будет поле Bar.SelectedFoo правильно сохраняет свою ссылку на массив? или я получу копию этого Foo?
Если я правильно помню, массивы не сериализуются подобным образом. Вы должны предоставить свой собственный механизм (через ISerializable inteface) для записи и чтения массивов.
Однако, в общем случае, если граф сериализуемых объектов с взаимными ссылками друг на друга сериализован с помощью BinaryFormatter, то ссылки будут воссозданы корректно без дублирования объектов. Сюда также должны входить объекты, которые вы указываете в своем пользовательском коде сериализации, при условии, что вы украсите свой Foo Serializable и передадите один и тот же экземпляр объекта в программу форматирования как из массива, так и из поля.