协议缓冲区可以部分更新吗?

时间:2014-06-11 12:20:52

标签: c++ protocols protocol-buffers updates

我是protobuf的新手,这是我的问题:协议缓冲区可以支持部分更新吗?

例如,我有这样的消息:

package model.test;

message Person{
    required int32 id = 1;
    required string name = 2;
    repeated PhoneNumber phone = 3;
}

enum PhoneType{
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
}

message PhoneNumber{
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
} 

现在我喜欢的数据是:

model::test::Person person;
person.set_id(1);
person.set_name("Jack");

model::test::PhoneNumber* _phone3 = person.add_phone();
_phone3->set_number("123567");
_phone3->set_type(model::test::MOBILE);

model::test::PhoneNumber* _phone4 = person.add_phone();
_phone4->set_number("347890");
_phone4->set_type(model::test::WORK);

情况是,只更改了work phone number时,我必须使用以下代码更新整个person对象。

fstream out("User.txt", ios::out | ios::binary | ios::trunc);
person.SerializePartialToOstream(&out);

但这样做效率不高。我想只更新PhoneNumber,protolbuf中是否存在任何部分更新或类似的内容?

2 个答案:

答案 0 :(得分:1)

我认为没有任何支持你想做什么。如果你考虑一下,首先存在某种部分更新序列化并不是真的有意义。为了使protobuf能够操作在磁盘上的文件中序列化的对象,它需要读取和反序列化整个对象,以便它知道先前填充了哪些字段。然后,当序列化并将更新的对象写回磁盘时,无论您做什么,都必须覆盖旧文件(即,您无法将额外的字节移入文件系统中的文件而不会覆盖原始文件完全)。

答案 1 :(得分:1)

实际上,协议缓冲区的设计使得连接与合并相同,并且合并时最后一个字段获胜(repeated除外,已添加)。在您的情况下,您实际上应该能够序列化包含 电话号码集的blob,并追加此数据,并且它将覆盖之前的值。但是,这仅适用于根对象。你的意思是:不是。它对repeated没有用,你的是:是。