打字
带有类型标签的传入消息非常自由,只要可以在不阅读所有消息的情况下判断传入消息是什么。如果是这样,那么您不再关心消息顺序。这是因为消息的接收者很容易处理发送的任何内容。所以你可以有一个应用程序,它只是坐在那里接受它得到的任何东西,并且只做适合每个人的任何事情。
格式
允许您定义值和大小约束的模式语言非常有用。这意味着消息的发送者不会意外发送无效消息。此外,接收者可以自动判断传入消息是否符合模式。这是实现网络服务的真正好处;大部分消息验证已为您完成!
通过大小限制,我的意思是您可以指定数组在模式中的长度,并且生成的代码将拒绝处理更长或更短的数组。通过值约束,想象一个名为“bearing”的消息字段;您可能希望将其限制在 0 到 359 之间。
这些都允许您对接口是什么做出清晰、明确的陈述,并自动执行。最近发生了多少安全漏洞,其中一些网络接口数据验证实施不当......
选项
完成这一切的一种序列化标准是 ASN.1。我使用的工具采用 ASN.1 模式并生成用于序列化和反序列化的代码,自动检查是否满足值和大小约束,并告诉您传入的消息类型是什么。ASN.1 的工具可能相当陈旧,需要更新。如果更新,它将是各种用途的理想选择,提供二进制和文本格式。
现在也有 JSON 模式,它们似乎有类型、值和大小限制。这可能是您正在寻找的。
我相当确定 Google Protocol Buffers 不能很好地进行类型标记,也没有进行值和大小限制。我在 GPB 架构中看到了以下注释:
// 不能大于 10。
如果这就是写入模式的内容,那么模式语言可以说是不够的......
我不确定 Thrift,我不确定它是否有价值限制(如果我错了,请有人纠正我!)。
缺点
一个都想不出来!它会激怒开发人员;他们认为很好的代码很容易被发现产生垃圾信息,这让他们非常恼火......