【问题标题】:Using Protocol buffer as general Data object?使用协议缓冲区作为通用数据对象?
【发布时间】:2009-11-26 04:01:09
【问题描述】:

我们将引入协议缓冲区作为一些后端 RPC 服务的新传输。因为在不同形式的相似对象之间手动穿梭数据存在阻力,我可以预见协议缓冲区实例被向上传递到堆栈比仅仅传递到 RPC 服务器接口要高一些。

这是我应该尽量避免的事情吗?将协议缓冲区对象视为普通数据持有者是否安全,并且可以快速有效地将其转换为二进制文件和从二进制文件中转换出来的便利?

我认为它是生成数据对象的好方法的另一个原因是必需/可选字段的概念和自动生成的构建器界面。

【问题讨论】:

    标签: java protocol-buffers


    【解决方案1】:

    嗯,使用这种方式它们不是非常方便,因为它们是不可变的 - 你可以传递构建器,但这会产生相当长的类型名称。这也意味着您受限于协议缓冲区(以及您自己的消息)支持的数据类型。

    这样做是安全,但它并不总是能创造出最好的设计。另一方面,有时这正是医生所要求的:)

    我建议你尝试一下——这里没有“一刀切”。

    【讨论】:

    • 我认为当涉及到使用这样的协议缓冲区时,它们是不可变的这一事实实际上是有帮助的,而不是有害的。它们和 String 一样是不可变的值对象。
    • 在某些情况下,当您可以以函数式风格编写代码时,它肯定会有所帮助。这部分取决于问题,部分取决于开发人员:)
    • 在某些情况下,不可变确实有帮助,由于未知原因,存在一些带有十几个参数的公共结构,全部分配给最终字段。构建器很棒,但每次都写得乏味和样板。获取必需与可选的逻辑也很棘手,如果必需字段被省略,build() 方法就会崩溃。
    【解决方案2】:

    一般来说,我会设计系统的各个层,以便一层的实现细节不会相互泄漏。我没有 Google 的协议缓冲区的直接经验,但听起来您想在传输和系统的更高层使用相同的表示。

    如果您决定停止使用 Protocol Buffers 作为传输表示,那么使用其他东西会有多容易?

    【讨论】:

    • 这实际上是朝着这一目标迈出的一步。现在,一组接口决定了我们的数据层、后端 RPC ,在某种程度上扩展了 RESTful Web 服务层。 疼痛。第 1 步是用协议缓冲区替换后端,以将其与其余部分分离。但这是一个很好的观点。如果我只是将所有内容都切换到 protobufs,那么我唯一解耦的是客户端和 RPC 服务之间的链接,而所有其他层都将依赖于 Message 对象......糟糕。
    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多