[英]Deep-copying with ProtoBuf in C/C++
假设我有一个指针数组,每个指针指向结构,这些结构可能再次指向其中的其他结构; 是否有可能使用protobuf处理序列化? 如果是这样,怎么样?
任何帮助将不胜感激。
你正在考虑这个问题的方式与你需要思考的方式相反,如果你正在考虑使用protobufs。 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
它。
我认为还有另一种方法也很有帮助。 由于.set_allocated_*(A)
具有会破坏A
副作用。 要从A
复制,您可以尝试.mutable_*()->CopyFrom(A)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.