Бинарная сериализация ссылок с использованием BinaryFormatter - PullRequest
0 голосов
/ 08 апреля 2011

Учитывая следующую структуру классов, 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?

1 Ответ

2 голосов
/ 08 апреля 2011

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

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

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

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

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

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

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

...