Двоичная сериализация ссылок с использованием BinaryFormatter

#.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 и передадите один и тот же экземпляр объекта в программу форматирования как из массива, так и из поля.