寻找一个好的答案字符串圆形物体

Looking for a good answer to stringify circular objects

本文关键字:答案 字符串 圆形物 一个 寻找      更新时间:2023-09-26

所以我环顾四周,脑子里有很多断开的链接和解释。

我在游戏应用程序中要求这样做,例如,所有者将拥有一个物品,并且该物品也由所有者持有。

我的服务器存储循环引用没有问题。但当客户端第一次登录时,我会将播放器对象发送给客户端。我很难理解如何做到这一点。物品可以由玩家在库存槽中持有,例如玩家将手放在头上。。。一个项目也可能在地面上的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)
}

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

简短的答案是不要!循环引用并不能给你带来任何真正的东西。以非圆形的方式表示这类数据有三种基本方法。当你说只有一个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>

再次注意,虽然角色拥有的对象是显式的,但另一种方式的链接是隐式的,您的解析器必须知道如何重建它。

或者,你甚至可以做一些类似于链接表的事情,比如SQL,其中连接从其他对象中完全删除并外部化。这种形式的好处是没有任何暗示。双向链接是非常清楚地陈述的,解析器重建它们将非常简单。

<character id='1'>
   ...
</character>
<object id='1' ... />
<link character='1' object='1' />

当然,相同的语义可以用您选择的格式表示,所以您可以用JSON或您喜欢的格式来表示。

你可能也会发现这很有用,https://stackoverflow.com/a/3341439/51031这为库提供了一些选项,这些库可以被告知排除一些链接,但问题仍然是,当取消序列化时,如何将对象重新缝合在一起。因此,无论如何,你最终都会遗憾地编写一些解析代码!