寻找字符串化圆形对象的好答案

时间:2012-08-19 15:59:48

标签: javascript json circular-reference

所以我看了很多关于我头脑的断链和解释。

我要求这是一个游戏应用程序,例如,所有者将拥有一个项目,该项目也由所有者持有。

我的服务器存储循环引用没有问题。 但是当客户第一次登录时,我会将玩家对象发送给客户端。我无法绕过如何做到这一点。物品可以由玩家在库存槽中持有,例如玩家将手捂在头上......物品也可以在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)
}

//将返回值存储为对象的属性

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为库提供了一些可以被告知排除某些链接的选项,但问题仍然是在反序列化时如何将对象再次拼接在一起。所以不管怎么说,你最终会遗憾地写出一些解析代码!