gpt4 book ai didi

javascript - 使用 Javascript 通过网络序列化对象 - 如何改进它?

转载 作者:行者123 更新时间:2023-11-30 12:33:21 24 4
gpt4 key购买 nike

我有一个 Message 类,它可以在数据通过网络时被序列化,我目前使用 JSON,主要是因为我对所有内容都使用 JSON。 (网络服务、套接字)。

我想改进序列化以使其尽可能好,我相信改进是可能的。

目的是使传输字符串更轻,尤其是在套接字(视频游戏)使用时,因为它将用于一切,每个响应客户端/服务器或服务器/客户端,甚至在内部服务器或客户端方法,这是提供数据的常用方式。

Message 是一个复杂的对象,它还可以包含其他对象实例,例如 MessageLang,它将负责根据代码在客户端翻译句子。

到目前为止一切正常,结果如下:

套接字服务器发出简单字符串:

verbose: websocket writing 5:::{"name":"user.newAuthenticated","args":["Respond to emitter"]}

套接字服务器发出简单消息实例:

verbose: websocket writing 5:::{"name":"user.newAuthenticated","args":["{\"m\":\"Respond to all clients\",\"d\":{},\"s\":1,\"t\":\"m\"}"]}

套接字服务器发出复杂的消息实例:

verbose: websocket writing 5:::{"name":"user.newAuthenticated","args":["{\"m\":{\"m\":\"__12\",\"a\":{\"field\":\"name\",\"min\":3,\"max\":20}},\"d\":{\"key\":\"fakeKey\"},\"s\":1,\"t\":\"m\"}"]}

复杂的消息将呈现以下句子:

名称的最小长度为 3。最大长度为 20。 并且将在 data 中包含 key: "fakeKey"。只是为了解释它是如何工作的。

如你所见,消息越来越大,这是正常的,但我想知道我可以做些什么来使这里的序列化更好:

  • 当没有(空)时删除消息本身
  • 数据为空时也删除
  • 为假时删除状态(因为它是默认值)
  • 我在套接字日志中看到很多 \ 因为它是 JSON,我认为这是一个问题,因为每次我添加一些东西我都会得到我不想要的额外字符。也许 JSON 不是一个好的选择,我应该以不同的方式序列化,首先像顶部的示例那样在 JSON 中,然后在其他东西中,可能是二进制,如果它占用更少的空间。

你怎么看?

如果用另一种格式加密消息是个好主意,那么加密的成本是否值得?因为加密也需要一些时间,所以我只是想知道它是否会解决问题,比如通过套接字发送消息会花费更少的时间,因为它会更轻,但我们会使用更多的时间来加密它。只是想知道。

最佳答案

我的猜测是您的消息对象有两个字段(nameargs)。

减少消息长度的第一步是摆脱(非常无用的)外部对象并用数组替换它。所以一条空消息

{"name":"empty","args":[]}

会变成

["empty",[]]

甚至

["empty"]

接下来的事情是你在参数序列化中有一个错误。您无需发送 JSON,而是将 JSON 数据包装在一个字符串中。示例:在经过身份验证的情况下,您发送

{"name":"user.newAuthenticated","args":["{\"m\":\"Respond to all clients\",\"d\":{},\"s\":1,\"t\":\"m\"}"]}

但你应该发送

{"name":"user.newAuthenticated","args":[{"m":"Respond to all clients","d":{},"s":1,"t":"m"}]}

相反。现在的问题是 args 是否是单个对象的列表。如果它始终是单个对象,那么您也可以去掉 []。根据我从上面建议的更改,这会给你:

["user.newAuthenticated",{"m":"Respond to all clients","d":{},"s":1,"t":"m"}]

在我看来,这是相当不错的。如果您可以使(反)序列化器正确处理默认值,则可以将其减少为:

["user.newAuthenticated",{"m":"Respond to all clients","s":1,"t":"m"}]

(即我们可以省略空的 d 属性)。

关于javascript - 使用 Javascript 通过网络序列化对象 - 如何改进它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com