【问题标题】:Protocol Buffers import message depending on another imported message协议缓冲区导入消息取决于另一个导入的消息
【发布时间】:2015-03-04 15:39:37
【问题描述】:

关于import语句,google说https://developers.google.com/protocol-buffers/docs/proto#services

您可以通过导入来自其他 .proto 文件的定义来使用它们。要导入另一个 .proto 的定义,您需要在文件顶部添加一个 import 语句。 默认情况下,您只能使用直接导入的 .proto 文件中的定义。

...听起来不错,但那又如何呢:

1.proto:

message M1{
   required string foo = 1;
}

2.proto:

import "1.proto";
message M2{
    required M1 m_1 = 1;
}

3.proto:

import "2.proto";
message M3{
    required M2 m_2 = 1;
}

所以,在解析 3.proto 时,M1 不应该是可访问的,因为 1.proto 不是从 2.proto 公开导入的。 不过M2应该是,因为是直接从3.proto导入的...

那么 M2.m_1 呢?编译器应该如何生成类?

【问题讨论】:

  • 也许有前向声明?尝试使用例如C++ 或 Java 看看。

标签: import protocol-buffers


【解决方案1】:

文档的意思是,如果要在文件中引用M1,则必须导入1.proto,如果要在文件中引用M2,则必须导入2.proto。您确实不需要需要显式导入隐式/传递依赖项。在不导入1.proto 的情况下使用M2 完全没问题。

编译器实际上遵循传递导入并读取所有三个文件以生成3.proto 的代码。此外,在 C++ 中,3.pb2.h 将是 #include "2.pb2.h",而 #include "1.pb2.h"。该规则只是一个语法规则。

为什么有这个规则?好吧,考虑一下您是否可以直接在3.proto 中使用M1 而无需显式导入1.proto,因为您导入了2.proto,而2.proto 本身导入了1.proto。现在考虑,稍后,2.proto 的维护者是否决定删除字段m_1。现在2.proto 不使用M1,因此维护者决定删除1.proto 的导入。但是现在3.proto 坏了,因为它依赖于2.proto 导入1.proto 的事实!

这是 C++ 包含的常见问题。我不想在 Protobufs 中遇到同样的问题,所以我制定了一个规则,即您必须显式导入所有声明您在自己的文件中显式使用的类型的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多