在 C/C++ 中使用 ProtoBuf 进行深度复制
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)
.
假设我有一个指针数组,每个指针都指向结构,而这些结构可能再次包含指向其中其他结构的指针;是否可以使用 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)
.