简短的回答是不要!循环引用并没有真正让你得到任何东西。以非循环方式表示此类数据有三种基本方式。当你说只有一个 id 作为指针时,你正朝着正确的方向前进。
我这样做的方法不是尝试拥有一个巨大的对象,它包含所有其他对象,具有列出用户角色的数据格式,并且仅引用项目,但实际上并未将它们放入角色的数据结构中.
每个对象都会有某种类型的 id,然后将两者连接起来。在 XML 中执行此操作(因为需要更好的语法)可能看起来像这样......
<character>
<possession ref='1' status='worn' />
<possession ref='2' status='inventory' />
</character>
<world>
<item ref='3' xpos='3' ypos='4' />
</world>
<object id='1' name='clothing' hp='12' />
<object id='2' name='gadget' hp='0' />
<object id='3' name='cash' hp='0' />
当您解析时,您会看到 refs 将对象连接到角色或世界。因此,当您构建实际对象时,您会为它们提供相互引用。
或者你可以做这样的事情......
<character>
<object id='1' name='clothing' hp='12' />
<object id='2' name='gadget' hp='0' />
</character>
<world>
<object id='3' name='cash' hp='0' />
</world>
再次注意,虽然角色拥有的对象是显式的,但另一种方式的链接是隐式的,您的解析器必须知道重建它。
或者你甚至可以做一些类似于链接表的事情,其中连接完全从其他对象中删除并外部化。这种形式的好处是没有任何暗示。双向链接非常明确,重建它们的解析器将非常简单。
<character id='1'>
...
</character>
<object id='1' ... />
<link character='1' object='1' />
当然,相同的语义可以以您选择的格式表示,因此您可以使用 JSON 或您喜欢的格式来执行此操作。
您可能还会发现这很有用,https://stackoverflow.com/a/3341439/51031它为库提供了一些选项,可以被告知排除某些链接,但问题仍然是当您再次将对象缝合在一起时反序列化。因此,以一种或另一种方式,您最终会遗憾地编写一些解析代码!