为什么协议缓冲区不是用标记为基于文本的文档建模的好方法?

时间:2019-05-02 18:30:23

标签: protocol-buffers google-protocol-buffer

The protocol overview from Google指出:

协议缓冲区并不总是比XML更好的解决方案–例如,协议缓冲区不是用标记(例如HTML)为基于文本的文档建模的好方法,因为您不能轻易地使结构与文本交错

我不确定我是否理解,有人可以给我一个适当的例子/解释吗?

1 个答案:

答案 0 :(得分:1)

想象一下以下HTML:

<p>Hello! <strong>This text is strong (bold).</strong> <em>This is
emphasized (italic).</em> And <a href="https://example.com">here is
a link</a>.</p>

如果您创建了一个合理的Protobuf富文本表示形式,然后以Protobuf文本格式将其写出,则它可能类似于:

{
  p: {
    children: { text: "Hello! " }
    children: {
      strong: {
        children: { text: "This text is strong (bold)." }
      }
    }
    children: { text: " " }
    children: {
      em: {
        children: { text: "This is emphasized (italic)." }
      }
    }
    children: { text: " And " }
    children: {
      a: {
        href: "https://example.com"
        children: { text: "here is a link" }
      }
    }
    children: { text: "." }
  }
}

如您所见,Protobuf表示看起来非常复杂。基础文本不再可读,因为结构占主导地位。

现在,就实际的数据结构而言,Protobuf表示形式实际上与HTML / XML解析器所构建的表示形式并没有很大不同。在代码中,使用它可能不再困难。而且Protobuf的二进制序列化可能是合理的。与XML表示相比,您甚至可以节省几个字节(尽管可能不多,因为大部分空间仍将被基础文本占用)。

如果您正在编写一个WYSIWYG富文本编辑器,其中用户从未看到过底层表示,那么使用Protobuf表示上述文本可能很有意义。

您引用的文本(我写的,顺便说一句!)试图说的是,如果您有一个用例,其中有人在用标记编写文本,但是必须在纯文本编辑器中这样做,那么Protobuf不是一个好的解决方案。 HTML或XML可以更好地进行文本标记。

OTOH,如果您可以人工编写纯文本格式的高度结构化数据,那么Protobuf文本格式可能会很好地工作!例如,许多人都以这种方式编写配置文件-很多人为此使用JSON,结果非常相似。同时,对于这些用例,XML变得非常麻烦和繁琐。

综上所述,当人们输入数据时,使用真正的人类优化格式可能是有意义的。对于带有标记的文本,请使用Markdown。对于配置文件等结构化数据,YAML非常好。但是请注意,Markdown和YAML不能作为两台计算机之间的交换格式正常工作。