在 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_*()->CopyFrom(A)
。
【讨论】:
以上是关于在 C/C++ 中使用 ProtoBuf 进行深度复制的主要内容,如果未能解决你的问题,请参考以下文章