所以我看了很多关于我头脑的断链和解释。
我要求这是一个游戏应用程序,例如,所有者将拥有一个项目,该项目也由所有者持有。
我的服务器存储循环引用没有问题。 但是当客户第一次登录时,我会将玩家对象发送给客户端。我无法绕过如何做到这一点。物品可以由玩家在库存槽中持有,例如玩家将手捂在头上......物品也可以在x,y位置的地面上我认为有某种容器的ID只是充当指针。而不是传递JSON字符串对象。
能够传递圆形对象会很棒或者是一个简单的函数,它可以使用Id来参考项目的工作位置。
这是我对解决方案的最佳尝试
//create an object
// run this function
function createRefrence(ref){
container = io.sockets.containersById.push(ref)
io.sockets.containersById[container-1]={ref:ref}
return (container-1)
}
//将返回值存储为对象的属性
答案 0 :(得分:2)
简短的回答是不要!循环引用并没有真正得到任何东西。有三种基本方式以非循环方式表示这种数据。当你说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为库提供了一些可以被告知排除某些链接的选项,但问题仍然是在反序列化时如何将对象再次拼接在一起。所以不管怎么说,你最终会遗憾地写出一些解析代码!