簡體   English   中英

使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM