VB.NET — пользовательская сериализация и циклические ссылки, есть ли чистое решение?

Я реализую некоторую пользовательскую сериализацию (в массив байтов) и столкнулся с проблемой обработки циклических ссылок.

Пример:

Class A
  public MyBs as new List(of B)
End class

Class B
  public MyParent as A
  public MiscInt1 as integer
  public MiscInt2 as integer
End Class

При сериализации A я должен сериализовать каждый экземпляр B.

Однако у меня возникла проблема при сериализации B.

Как записать родителя B, не вызывая бесконечного цикла?

Идея:

Если я знаю, что экземпляр B будет когда-либо сериализован только через сериализацию экземпляра A, то я могу обработать настройку ссылки MyParent из экземпляра A и даже не записывать эту информацию в байтовый буфер для экземпляра. из Б

Это кажется не совсем правильным, но это может быть лучшим решением.

Есть ли более чистый способ справиться с этой ситуацией?


person Brian Webster    schedule 03.08.2010    source источник


Ответы (1)


Вы можете использовать подход, аналогичный стандартному BinaryFormatter из BCL: используйте ObjectIDGenerator и сохранять идентификатор ссылки вместо объекта в случае циклических ссылок

person desco    schedule 03.08.2010
comment
Как узнать тип ссылки, которую вы восстанавливаете во время десериализации? Вы просто делаете вывод, исходя из контекста? - person Brian Webster; 03.08.2010
comment
Встроенная реализация сохраняет идентификатор объекта (плюс информацию о типе при первом появлении экземпляра объекта): (A-1)(ListB-2)(B-3)(ref-1)(10)(20)(B-4)( ссылка-1)(100)(200). Когда идентификатор встречается впервые, вы сохраняете идентификатор и десериализованный объект. При более поздних появлениях этого идентификатора вы возьмете существующий объект. - person desco; 03.08.2010