protobuf的使用误区(cpp)

根据我使用中发现的问题,protobuf的使用需要慎重使用ParseFromString来实现反序列化的。

有兴趣深究protobuf反序列化原理的兄台可以瞅瞅序列化之后的内容,好像是如下格式

一个字节的转译字符 | member name| member value


如果有一个memory buffer,现在需要反序列化为一个类,万不可使用ParseFromString,隐藏着潜在的bug。如果buffer中有非字符内容,肯定反序列化的结果是有问题的。截断的情况是隐藏的,视buffer内容而定,最关键的一点,发生截断的时候也没有异常。其场景如下代码(错误用法)

char * buf ;
...获取内存快内容
string str = buf ;
proto.ParseFromString(str)


此时需要做如下的操作:

用memory buffer实例化stringstream对象,

调用stringstream的pubsetbuf(basebuf, length)函数将内存块填充进去,注意,此处不可以将buffer赋值给一个string对象,然后用string对象构造一个stringstream。这时候会发生截断。

看到github上面的很多人的使用都是错误的。本来想找一个epoll+protobuf的基础工程的代码的,看来这个工作还得自己去做。

其问题可以简化用以下代码描述。(错误用法)

char * buf ;
...
string str = buf ;
stringstream s(str) ;
proto.ParseFromIstream(s);

如下代码段的用法为正确用法

stringstream s;
s.rdbuf()->pubsetbuf(buf, length);
proto.ParseFromIstream(&s) ;	

注意上面的length不能用strlen(buf)来获取。

### 回答1: protobuf-cpp3.5.1是Google开发的一种数据序列化格式,它的全称是Protocol Buffers,也被简称为ProtoBufProtoBuf是一种简单高效的数据交换格式,被广泛应用于分布式系统和网络通信中。 protobuf-cpp3.5.1使用.proto文件定义数据结构,然后使用专门的编译器将.proto文件编译成不同编程语言的源代码。这样,我们就可以在自己的项目中使用生成的源代码来实现数据的序列化和反序列化。ProtoBuf支持多种编程语言,如C++、Java、Python等,因此可以在不同的环境中使用使用protobuf-cpp3.5.1的好处是它具有高效的序列化和反序列化速度,可生成的代码较小,占用的存储空间少,并且在网络传输过程中具有较高的效率。它还支持向后兼容性和扩展性,可以通过向.proto文件中添加新字段实现数据结构的升级。 另外,protobuf-cpp3.5.1还支持数据压缩的功能,可以将序列化后的数据进行压缩,减少网络传输的数据量,提高传输效率。 总之,protobuf-cpp3.5.1是一种强大的数据序列化格式,具有高效、灵活和可扩展的特点。它在分布式系统、网络通信和持久化存储等场景中广泛应用,并且是一种跨语言的解决方案。 ### 回答2: protobuf-cpp3.5.1是Google开发的一种数据序列化格式。它是一种语言无关、平台无关的数据交换格式,可用于不同系统之间的数据通信和存储。 protobuf-cpp3.5.1的特点包括: 1.高效的数据编码和解码:protobuf-cpp3.5.1使用二进制格式进行数据编码,相较于文本格式如XML和JSON,它具有更高的效率和更小的存储空间,节省了网络传输带宽和存储空间。 2.可扩展性:protobuf-cpp3.5.1支持数据结构的演化和扩展,即使在数据结构发生改变时,旧版本的数据仍然可以被解析和使用。它通过使用字段标识符和数据类型进行数据的序列化和反序列化,保证了数据的版本兼容性。 3.跨平台支持:protobuf-cpp3.5.1提供了多种语言的API和工具包,可以在不同的操作系统和开发语言中使用。目前支持的语言包括C++、Java、Python等,用户可以根据自己的需求选择合适的语言进行开发和使用。 4.可读性强:protobuf-cpp3.5.1使用了清晰的结构化数据描述语言(IDL),可以用类似于编程语言的语法定义数据结构,在代码中很容易理解和修改。 5.性能优越:由于protobuf-cpp3.5.1使用二进制格式进行数据序列化,具有更快的编解码速度和更小的数据体积,所以在性能上优于其他文本格式。 总之,protobuf-cpp3.5.1作为一种高效、可扩展、跨平台的数据序列化格式,在不同的应用场景中得到了广泛的应用。它可以用于网络通信、分布式系统、数据存储等各种场景,提供了一种简单、快速、可靠的数据交换和存储方案。 ### 回答3: protobuf-cpp3.5.1是Google开发的一种数据序列化和反序列化的工具。它采用了一种二进制编码格式,能够高效地将结构化数据转换为字节流,并可将字节流还原为原始的结构化数据。 protobuf-cpp3.5.1具有以下特点: 1. 简化数据传输:protobuf-cpp3.5.1可以将结构化数据编码成二进制格式,从而减少了数据在网络传输和存储中的大小。这样可以降低网络传输和磁盘存储的消耗,提高系统性能。 2. 跨语言支持:protobuf-cpp3.5.1的编码格式是与语言无关的,可以通过代码生成工具将通用的数据结构定义转换为各种编程语言的类或结构体。这样在不同的编程语言环境中,可以使用相同的数据格式进行数据交换。 3. 可扩展性:protobuf-cpp3.5.1支持向后兼容和向前兼容的数据格式变更,通过版本管理和字段标签,可以避免破坏现有代码的同时进行数据格式的扩展和变更。 4. 高效的序列化和反序列化速度:protobuf-cpp3.5.1通过使用紧凑的编码格式和生成高效的序列化代码,提供了快速的数据序列化和反序列化性能。 5. 自动生成代码:protobuf-cpp3.5.1提供了代码生成工具,可以根据定义的数据结构生成序列化和反序列化的代码。这样可以节省开发人员手动编写序列化和反序列化代码的时间和工作量。 总的来说,protobuf-cpp3.5.1是一个高效、跨语言、可扩展的数据序列化工具,能够帮助开发人员简化数据传输和存储,提高系统性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值