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

Ron*_*ael 5 c c++ protocol-buffers protobuf-c

假设我有一个指针数组,每个指针指向结构,这些结构可能再次指向其中的其他结构; 是否有可能使用protobuf处理序列化?如果是这样,怎么样?

任何帮助将不胜感激.

huu*_*huu 6

你正在考虑这个问题的方式与你需要思考的方式相反,如果你正在考虑使用protobufs.Protobufs不采用现有的数据结构并对其进行序列化.他们采用序列化协议并为您填充数据结构.

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

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

message Outer {
    required Inner inner = 1;
}

message Pointers {
    repeated Outer outer = 1;
}
Run Code Online (Sandbox Code Playgroud)

假设你已经正确编译了这个,你可以使用这个协议从外面工作.也就是说,你从最高的结构开始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
Run Code Online (Sandbox Code Playgroud)

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

Inner* inner = new Inner();
inner->set_value("Hello world");
Outer outer;
outer.set_allocated_inner(inner);
Run Code Online (Sandbox Code Playgroud)

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