【问题标题】:Extending Protobuf with my own methods用我自己的方法扩展 Protobuf
【发布时间】:2011-04-23 06:31:16
【问题描述】:

我应该如何在 Protobuf 消息中添加方法?

假设我的 .proto 文件中有:

package proto;
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;    
}

我想在消息中添加一个方法,比如字符串concatenateNameEmail()

我现在要做的是创建自己的 C++ 类,如下所示:

class Person : public proto::Person
{
public:
  Person( proto::Person const & person_ )
  : proto::Person(person_)
  {}

  string concateNateNameEmail()
  {
   ...
  }
};

所以缺点是我需要调用 proto::Person 复制构造函数。还有比这更优雅的解决方案吗?

【问题讨论】:

  • 我不认为包含“包”和“消息”的第一段代码是有效的 C++ 语法。“包”之所以突出显示语法可能是因为它是某种语言中的关键字, 但我不认为它是 C++ 中的关键字。
  • 对不起,我不清楚。第一个代码块是一个原型消息定义。让我清理一下帖子。

标签: c++ protocol-buffers


【解决方案1】:

Google Protobuf 并不是专门用于扩展的。这是文档中的一段(中间:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

协议缓冲区和 O-O 设计 协议缓冲区类基本上是 哑数据持有者(如结构 C++);他们头等舱不好 对象模型中的公民。如果你 想要添加更丰富的行为到 生成类,最好的方法 这是包装生成的协议 中的缓冲区类 特定于应用程序的类。 ... 你 永远不应该将行为添加到 通过继承生成的类 这会破坏内部 机制不好 无论如何都是面向对象的实践。

我知道如果您只想要一种方法,这样的建议会显得很烦人,但总的来说,这是非常好的建议。如果您确实没有其他功能可以保证创建一个特定于应用程序的“Person”类,那么只定义一个顶级函数并没有错:

string concatenateNameEmail(const proto::Person &person) { ... }

【讨论】:

    猜你喜欢
    • 2022-12-14
    • 2017-07-27
    • 2012-10-05
    • 2013-01-03
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多