簡単に言えば、しないでください。循環参照では、実際には何も得られません。この種のデータを非循環的な方法で表現するには、3 つの基本的な方法があります。ポインタとしてIDを持っていると言うとき、あなたは正しい方向に向かっています。
私がこれを行う方法は、他のすべてがユーザーのキャラクターをリストするデータ形式を持ち、アイテムを参照するだけで、実際にはキャラクターのデータ構造内にそれらを配置しない1つの巨大なオブジェクトを作成しようとするのではなく、. .
各オブジェクトには、2 つを接続する何らかの種類の 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' />
それを解析すると、参照がオブジェクトをキャラクターまたは世界に接続していることがわかります。したがって、実際のオブジェクトを構築する際に、それぞれに相互参照を与えます。
あるいは、このようなことをすることもできます...
<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>
繰り返しになりますが、キャラクターが所有するオブジェクトは明示的ですが、他の方法のリンクは暗黙的であり、パーサーはそれを再構築する必要があることに注意してください。
または、接続が他のオブジェクトから完全に削除され、外部化される SQL のリンク テーブルに似たようなことを行うこともできます。この形式の良いところは、何も暗示されていないことです。双方向リンクは非常に明確に記述されており、それらを再構築するパーサーは非常に単純です。
<character id='1'>
...
</character>
<object id='1' ... />
<link character='1' object='1' />
もちろん、同じセマンティクスを選択した形式で表すことができるため、JSON または好みの形式でこれを行うことができます。
また、これが役立つこともあるかもしれません.デシリアライズします。いずれにせよ、残念ながら解析コードを書くことになります!