VB.NET-自定义序列化和循环引用,是否有干净的解决方案?

VB.NET-自定义序列化和循环引用,是否有干净的解决方案?,.net,vb.net,serialization,infinite-loop,circular-reference,.net,Vb.net,Serialization,Infinite Loop,Circular Reference,我正在实现一些自定义序列化(到字节数组),在处理循环引用时遇到了问题 例如: 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的父级而不引起无限循环 一个想法:

我正在实现一些自定义序列化(到字节数组),在处理循环引用时遇到了问题

例如:

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的一个实例的序列化来序列化,那么我可以从A的实例处理MyParent引用的设置,甚至不在B的实例的字节缓冲区中记录该信息

这感觉不太对,但可能是最好的解决方案


有没有更干净的方法来处理这种情况?

您可以使用类似于BCL标准BinaryFormatter的方法:在循环引用的情况下,使用并存储引用id而不是对象

如何知道在反序列化过程中恢复的引用的类型?您只是根据上下文推断它吗?内置实现存储对象标识符(以及对象实例首次出现时的类型相关信息):(A-1)(列表B-2)(B-3)(参考-1)(10)(20)(B-4)(参考-1)(100)(200)。第一次满足标识符时,存储id和反序列化对象。在该标识符的后面出现时,您将使用现有对象。