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

标签 c++ c protocol-buffers protobuf-c

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

如有任何帮助,我们将不胜感激。

最佳答案

您考虑这个问题的方式与您在考虑 protobufs 时需要考虑的方式相反。 Protobufs 不采用现有数据结构并对其进行序列化。他们采用序列化协议(protocol)并为您创建数据结构,您可以填充。

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

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

message Outer {
    required Inner inner = 1;
}

message Pointers {
    repeated Outer outer = 1;
}

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

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 指针的所有权,这样您就不必手动删除它了。

关于c++ - 在 C/C++ 中使用 ProtoBuf 进行深度复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29906421/

相关文章:

c++ - C++ 中的移位运算符

c++ - libavcodec/libx264 不产生 B 帧

c++ - 使用 std::cout 时 SerializeToZeroCopyStream 和 SerializeToOstream 有什么区别?

java - 带有数据流的 Apache Beam Go SDK

protocol-buffers - Kotlin 重写 protobuf 类型 toString

python - 尝试在 Python : delete item in map and "vector.erase(vector.end())" 中重写 C++ 代码时出现问题

c++ - 具有折叠表达式的模板会创建不需要的参数拷贝

c++ - uint32_t,用于表示变量大小的 int_t 表示法

封装静态2D对象的CUDA结构

c - 具有正确文件长度和缓冲区分配的 fread 段错误