1

因此,我在脑海中环顾了很多断开的链接和解释。

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

我的服务器存储循环引用没有问题。但是当客户端第一次登录时,我将播放器对象发送给客户端。我无法思考如何执行此操作。物品可以由玩家在库存槽中持有,例如玩家将手放在头上......物品也可能在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)
}

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

4

1 回答 1

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它为库提供了一些选项,可以被告知排除某些链接,但问题仍然是当您再次将对象缝合在一起时反序列化。因此,以一种或另一种方式,您最终会遗憾地编写一些解析代码!

于 2012-08-19T16:28:50.207 回答