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

Учитывая следующую структуру классов, будет ли 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) Если Bar просто украшен атрибутом [Serializable], будет ли поле Bar.SelectedFoo правильно поддерживать свою ссылку в массив? или я получу копию этого Foo?


person mhildreth    schedule 07.04.2011    source источник


Ответы (1)


1) ТРЕБУЕТ ли BinaryFormatter, чтобы класс Bar был украшен атрибутом [Serializable] или реализовал интерфейс ISerializable?

Да, это так, если BinaryFormatter должен использоваться для сериализации экземпляра Bar.

2) Нужно ли украсить класс Foo атрибутом [Serializable]?

Да, если вы не создаете настраиваемый механизм сериализации, который не включает сериализацию экземпляра объекта Foo. Например, вы можете сериализовать компоненты x и y отдельно и создать на их основе новый экземпляр Foo в своем коде десериализации. В противном случае он должен иметь атрибут или интерфейс.

3) Если Bar просто украшен атрибутом [Serializable], будет ли поле Bar.SelectedFoo правильно поддерживать свою ссылку в массив? или я получу копию этого Foo?

Если я правильно помню, массивы таким образом не сериализуются. Вы должны предоставить свой собственный механизм (через интерфейс ISerializable) для записи и чтения массивов.

Однако в целом, если граф сериализуемых объектов со взаимными ссылками друг на друга сериализуется с помощью BinaryFormatter, то он правильно воссоздает ссылки без дублирования объектов. Это также должно включать объекты, которые вы указываете в своем пользовательском коде сериализации, если вы украшаете свой Foo с помощью Serializable и передаете тот же экземпляр объекта в модуль форматирования как из массива, так и из поля.

person Jeffrey L Whitledge    schedule 07.04.2011