是否有通过Web套接字连接发送数据的'正确'或首选方式?
在我的情况下,我将信息从C#应用程序发送到python(tornado)Web服务器,我只是发送一个由逗号分隔的几个元素组成的字符串。在python中,我使用基本技术来分割字符串,然后将元素结构化为一个对象。 e.g:
'foo,0,bar,1'
变为:
object = {
'foo': 0,
'bar': 1
}
在另一个方向,我将信息作为JSON字符串发送,然后使用Json.NET反序列化
我认为没有严格的正确或错误的做法,但是我应该考虑哪些优点和缺点?并且,有些相关,是否有使用字符串与二进制格式的共识?
答案 0 :(得分:1)
编写自定义编码(例如,“k,v,..”)与“使用二进制”的不同。
它仍然是文本,只是一种严格的欠定义的一次性手动滚动格式,必须手动复制。 (如果键或值包含逗号会发生什么?如果数据需要包含嵌套对象会发生什么?null如何解释为与''或'null'不同?)
虽然JSON绝对是WebSockets中最常用的无处不在的格式,但是不应该(为了交换目的)手工编写JSON - 一端使用现有的序列化库 。 (JSON无处不在的原因有很多,其他答案也包括在内 - 但这并不意味着它始终是'最佳'格式。)
为此,还可以使用二进制序列化器(BSON是一个简单的例子,因为它在结构和操作方面实际上类似于JSON)。只需根据需要将JSON.parse
替换为FORMATX.parse
。
唯一的要求是:
所有客户端和服务器都有合适的串行器/解串器。 JSON在这里工作得很好,因为它非常受欢迎,并且不乏实现。
各种二进制序列化库, Python和C#库,但它需要找到一个“快乐的交集点”。
序列化格式可以表示数据。 JSON通常可以正常工作,并且它具有与基本对象图和简单值的非常好的1-1对应关系。它本质上也是无模式的。
某些格式更好的是某些任务,并具有不同的特征,功能或工具链。然而,大多数概念(可以说是大多数DTO)都可以轻松映射到JSON,这使它成为一个很好的“默认”选择。
二元和文本序列化的不同种之间的其他差异最主要是穿着 - 但是如果你想开始讨论模式与无模式,可扩展性,外部工具,元数据,非压缩编码大小(或传输压缩后的大小),符合特定的现有协议等。
..但要点的是不要创建'新'的一次性格式。除非当然,你只是喜欢制作轮子或者有一个非常具体的用例。
答案 1 :(得分:0)
第一个建议是两种方式使用相同的格式,而不是一个方向的纯文本和另一个方向的JSON。
我个人认为{'foo':0,'bar':1}
比foo,0,bar,1
更好,因为每个人都理解JSON,但对于您的自定义格式,他们可能没有一些解释。我们的想法是,当JSON已经存在并且@ jfriend00是正确的时,您正在发明数据交换格式,几乎每种语言现在都能理解JSON,Python included。
关于文本与二进制,没有任何共识。正如@ user2864740在评论中提到我的答案,只要双方互相理解,这并不重要。只有当其中一方偏好格式时才会变得相关(例如考虑使用JavaScript从浏览器打开连接 - 因为人们可能更喜欢JSON而不是二进制)。
我的建议是使用简单的JSON设计并设计您的应用程序,以便您可以通过交换其他实现来更改有线格式,而不会影响应用程序的逻辑。