`
cwqcwk1
  • 浏览: 89283 次
文章分类
社区版块
存档分类
最新评论

解决protobuf数据丢失bug

 
阅读更多

protobuf是Google开发的一个开源序列化框架,类似XML,JSON,其最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。但是,protobuf在使用当中也发现一些问题,数据在protobuf序列化后无法反序列化,或者丢失部分数据,这就与protobuf的目的违背。下面我们来看下这个问题吧。

首先定义一个protobuf结构,如下:

message Person {
  required int32 mid = 1;
  required int32 type = 2;
}
再来看下这段代码,看似没有问题:

Person psn0;
psn0.set_mid(1);
psn0.set_type(0);

string str0;
psn0.SerializeToString(&str0);

// 由于网络传输, string 需要转换成 char*
const char* buf = str0.c_str();

// 如果是这样解析,将会引起bug
string str1 = buf;

People psn1;
bool ret1 = psn1.ParseFromString(str1);

if (ret1)
{
	cout << "str1 parse success" << endl;
}
else
{
	cout << "str1 parse fail" << endl;
}

// 这样解析不会引起bug
string str2;
str2.assign(buf, str0.length());

People psn2;
bool ret2 = psn2.ParseFromString(str2);

if (ret2)
{
	cout << "str2 parse success" << endl;
}
else
{
	cout << "str2 parse fail" << endl;
}

运行结果,如下:

str1 parse fail
str2 parse success

这里解释一下原因:在以上例子中,protobuf 序列化的 string 数据里含有 '\0' 字符。如果以 char* 取protobuf序列化后的数据,将会丢失部分数据。

虽然这个严格意义来讲也不算protobuf的bug,但在protobuf的使用中一般很少人注意protobuf 的数据中带有'\0' 字符,这就导致了bug的发生。

参考:

http://blog.csdn.net/mycwq/article/details/19619875

分享到:
评论

相关推荐

    protoc(Protobuf解码解密工具)用于无原始类时反编译数据,结构分析.rar

    Protobuf,全称为Protocol Buffers,是Google开发的一种数据序列化协议,用于高效地存储和传输数据。它提供了一种语言无关、平台无关的方式,使得应用程序可以轻松地存储、读取和交换各种类型的数据。Protobuf的主要...

    Netty发送protoBuf格式数据

    ProtoBuf(Protocol Buffers)是由Google开发的一种轻量级、快速且语言无关的数据序列化协议,它可以将结构化的数据转换为二进制流,方便在网络中传输。而Netty是一款高性能、异步事件驱动的网络应用框架,常用于...

    解决 protobuf-gen-lua 跨文件引用message protoc-gen-lua

    解决 protobuf-gen-lua 跨文件引用message,直接覆盖这个文件,重新生成lua文件,就能解析到跨文件引用的message

    python导出protobuf数据表及类

    在Python编程中,protobuf(Protocol Buffers)是一种高效的数据序列化技术,由Google开发,用于结构化数据的存储和通信。它提供了简单、快速且跨平台的方式来编码和解码数据,使得不同系统间的通信变得更加简单。...

    Springboot集成websocket+protobuf基本Demo,可实现后端与前端数据实时发送与接收.zip

    protobuf是Google推出的一种高效的数据序列化协议,它能将结构化数据序列化为二进制流,相比JSON或XML,protobuf更紧凑、解析速度更快。 在Spring Boot中使用protobuf,首先需要定义.proto文件,该文件描述了数据的...

    类似protobuf的自定义数据结构

    标题中的“类似protobuf的自定义数据结构”指的是Google开源的Protocol Buffers(protobuf)技术,它是一种高效的数据序列化协议,常用于结构化数据的存储和通信。protobuf提供了一种方式来定义数据结构,然后可以...

    protobuf-3.5.2 协议缓冲区 - 谷歌的数据交换格式

    **protobuf-3.5.2:谷歌的数据交换格式详解** 协议缓冲区(Protocol Buffers,简称protobuf)是谷歌推出的一种高效、灵活的数据序列化技术,它允许开发者定义数据结构,然后将这些数据结构序列化为二进制格式,以便...

    采用netty与protobuf进行文件传输

    总的来说,采用Netty与Protobuf进行文件传输,可以实现高效、安全、可扩展的网络通信解决方案,广泛应用于大数据传输、云存储、分布式系统等领域。这种技术组合充分利用了两者的优势,使得文件传输不仅速度快,而且...

    Unity3D Socket通信使用Protobuf数据格式

    1.Scripts/Socket/Protobuf:Protobuf源码 2.Scripts/Socket/ProtocalData: 存放*.proto 转换后的 *.cs 协议数据结构文件 3.Scripts/Socket: 其他,Socket相关脚本。 备注:使用的是Protobuf的源码,如果后期有效...

    C#中使用ProtoBuf优化百万级数据的存取性能

    1、以20个浮点类型字段,1百万条记录为测试数据 2、分别对比二进制与ProtoBuf序列化、反序列化、显示速度的耗时对比以及占用空间大小对比 3、在增加压缩功能后再进行序列化、反序列化、显示速度的耗时对比以及占用...

    springboot集成netty,使用protobuf作为数据交换格式,可以用于智能终端云端服务脚手架

    本项目“springboot-netty-protobuf-master”旨在提供一个基础架构,它利用了Spring Boot的便捷性以及Netty的高效网络通信能力,同时采用Google的Protocol Buffers(protobuf)作为数据交换格式,确保数据传输的高效...

    protobuf-2.4.1数据协议文件

    protobuf-2.4.1数据协议文件是一种高效且灵活的数据序列化工具,广泛应用于软件开发中的数据通信和存储。Protocol Buffers(简称protobuf)由Google开发,它提供了一种方式来定义数据结构,并能将这些结构化数据转换...

    protobuf-decoder-master.zip

    此解码器的特别之处在于,它允许用户解析protobuf数据流,即使没有原始的.proto定义文件,这对于某些场景非常有用,比如处理丢失或不可用协议定义的情况。 这个项目依赖于yarn,yarn是JavaScript项目管理和构建工具...

    protobuf3.20.1-windows64

    protobuf在数据存储中的应用广泛,它可以用来存储结构化数据到磁盘,或者在网络中传输数据。由于protobuf的效率高,占用空间小,常被用作数据库存储格式,比如作为NoSQL数据库内部的数据表示,或在分布式系统中作为...

    protobuf3.20.1 for android

    标题中的"protobuf3.20.1 for android"指的是Google开发的一种高效的数据序列化协议——Protocol Buffers(protobuf)的3.20.1版本,专门为Android平台的arm64-v8a架构优化。Protocol Buffers是一种语言无关、平台...

    protobuf转换为json

    7. **错误处理**:在修复bug的同时,也要考虑错误处理机制,比如当protobuf数据有误或者不完整时,转换过程应该能够适当地报告错误并处理异常情况。 综上所述,protobuf转换为json是一个涉及编码、解码、数据格式...

    protobuf数据交互

    总的来说,protobuf是实现数据交互的一种强大工具,无论是在同一进程还是不同进程之间,都能提供高效、灵活且易于维护的数据交换解决方案。在实际项目中,结合RPC框架和其他系统组件,可以构建出高性能的分布式应用...

    protobuf中文学习文档

    Protocol Buffers(简称protobuf)是Google开发的一种数据序列化协议,用于高效地存储和传输结构化数据。它通过定义消息格式,将数据结构转换为二进制流,相比XML或JSON等文本格式,protobuf在传输和存储时具有更高...

    protobuf-2.5.0下载

    protobuf,全称Protocol Buffers,是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够读写这些结构的代码,适用于多种编程语言,包括C++, Java, Python等。protobuf-2.5.0是该协议的一个...

Global site tag (gtag.js) - Google Analytics