在 C/C++ 中使用 ProtoBuf 进行深度复制

Posted

技术标签:

【中文标题】在 C/C++ 中使用 ProtoBuf 进行深度复制【英文标题】:Deep-copying with ProtoBuf in C/C++ 【发布时间】:2015-04-27 21:37:51 【问题描述】:

假设我有一个指针数组,每个指针都指向结构体,这些结构体中可能又包含指向其他结构体的指针;是否可以使用 protobuf 处理序列化?如果有,怎么做?

任何帮助将不胜感激。

【问题讨论】:

"How" 是什么意思,你想解释一下,如何在 c++ 中使用 protobuf? @AlanStokes:我实际上正在为不同的项目使用两者。任何一个方面的帮助都会很棒。 @MikeMB:我希望有一个嵌套指针可能发挥作用的例子。我能找到的例子都相当琐碎。 【参考方案1】:

您考虑这个问题的方式与考虑 protobuf 时需要考虑的方式相反。 Protobufs 不采用现有的数据结构并将它们序列化。它们采用序列化协议并为您创建填充的数据结构。

话虽如此,嵌套序列化非常简单:

// nested.proto
message Inner 
    required string value = 1;


message Outer 
    required Inner inner = 1;


message Pointers 
    repeated Outer outer = 1;

假设你已经正确编译了这个,你可以使用这个协议从外向内工作。也就是说,你从最高的结构 Pointers 开始,然后进入 Inner 对象:

Pointers pointers;
for (int i = 0; i < 10; ++i) 
    auto outer = pointers.add_outer();
    auto inner = outer->mutable_inner();
    inner->set_value(std::to_string(i));


std::stringstream stream;
pointers.SerializeToOstream(&stream);

...

Pointers parsed_pointers;
parsed_pointers.ParseFromIstream(&stream);
for (int i = 0; i < parsed_pointers.outer_size(); ++i) 
    std::cout << parsed_pointers.outer(i).inner().value() << std::endl;


// This prints 0, 1, 2, ..., 9 all on their own lines

可以从Inner 消息开始,但是将所有权传递给Outer 消息的方式并不简单或明显:

Inner* inner = new Inner();
inner->set_value("Hello world");
Outer outer;
outer.set_allocated_inner(inner);

调用该方法将捕获inner 指针的所有权,因此您不应该自己手动delete

【讨论】:

【参考方案2】:

我认为还有另一种方法也很有帮助。因为.set_allocated_*(A) 有一个副作用会破坏A。要仅从A 复制,您可以尝试.mutable_*()-&gt;CopyFrom(A)

【讨论】:

以上是关于在 C/C++ 中使用 ProtoBuf 进行深度复制的主要内容,如果未能解决你的问题,请参考以下文章

C++ protobuf使用介绍

protobuffer java中文乱码怎么解决

序列化:ProtoBuf与JSON的比较

序列化:到底该用ProtoBuf还是JSON?

重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!

深度学习-图像分割