Google Protobuf Primer (1) 实现跨平台跨语言的序列化/反序列化
0 Overview
Google Protocol Buffer 是一个平台无关、语言无关的结构化数据的序列化与反序列化工具。
1 Establish dev environment
wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
tar zxvf protobuf-2.4.1.tar.gz
cd protobuf-2.4.1
mkdir /Users/michael/Development/opt/protobuf-2.4.1
./configure --prefix=/Users/michael/Development/opt/protobuf-2.4.1
make
make check
make install
2 Protocol file
创建一个名为 lm.helloworld.proto 的文件。
package lm;
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; // optional field
}
一般 Google Protobuf 的 protocol 文件名形如:
packageName.MessageName.proto
3 Generate protocol classes
此时的目录结构:
protobuf-2.4.1
|---bin
|---include
|---lib
|---test
|---lm.helloworld.proto
编译生成 Google Protobuf 类文件:
alias protoc='/Users/michael/Development/opt/protobuf-2.4.1/bin/protoc'
SRC_DIR=.
DST_DIR=.
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/lm.helloworld.proto
此时的目录结构为:
protobuf-2.4.1
|---bin
|---include
|---lib
|---test
|---lm.helloworld.proto
|---lm.helloworld.pb.cc
|---lm.helloworld.pb.h
4 Application files
此处以 File Stream 为例。
4.1 Structured data -> Stream
#include "lm.helloworld.pb.h"
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
lm::helloworld msg1;
msg1.set_id(101);
msg1.set_str("hello");
fstream output("./log", ios::out | ios::trunc | ios::binary);
if (!msg1.SerializeToOstream(&output))
{
cerr << "Failed to write msg." << endl;
return -1;
}
return 0;
}
跟已有的结构化数据结构(依据 Google Protobuf 的格式)创建数据,将结构化数据序列化到流中。
4.2 Stream -> Structured data
#include "lm.helloworld.pb.h"
#include <iostream>
#include <fstream>
using namespace std;
void ListMsg(const lm::helloworld & msg)
{
cout << msg.id() << endl;
cout << msg.str() << endl;
}
int main(int argc, char* argv[])
{
lm::helloworld msg1;
{
fstream input("./log", ios::in | ios::binary);
if (!msg1.ParseFromIstream(&input))
{
cerr << "Failed to parse address book." << endl;
return -1;
}
}
ListMsg(msg1);
}
将流中的序列化数据,读取到依据 Google Protobuf 的格式创建的对象中。
5 Compile executable files
5.1 Directories and file tree
protobuf-2.4.1
|---bin
|---include
|---lib
|---test
|---lm.helloworld.proto
|---lm.helloworld.pb.cc
|---lm.helloworld.ph.h
|---write.cpp
|---read.cpp
5.2 Compile
g++ lm.helloworld.pb.cc write.cpp -o write.out -I ../include -L../lib -lprotobuf
Notice:
- 编译应用程序源文件时,要记得同时编译 lm.helloworld.pb.cc 源文件;
- 记得 Include Google Protobuf headers(-I ../include)
- 记得 Link 路径以及相应的 google protobuf libraries(-L../lib -lprotobuf)
6 Run
运行 write:
./write
会观察到生成如下文件(参见源程序):
log
运行 read:
./read
输出结果:
$ ./read.out
101
hello
7 Review
- 环境:搭建 Google Protobuf 的开发环境;
- 协议:根据 Google Protobuf 格式要求,创建 Protocol 文件;
- 生成:利用 protoc 编译生成所定义的 Protocol 的类源文件与头文件;
- 应用:编写利用所生成的 Protocol 的类源文件与头文件;
- 编译:编译所编写的应用的源文件与头文件,注意头文件路径、库文件路径及库;
- 运行。
Reference
- http://stackoverflow.com/questions/8875867/linking-errors-when-using-proto-tutorial
- http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
- http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/overview.html
-
Happy Coding, enjoy sharing!
转载请注明来自“柳大的CSDN博客”:Blog.CSDN.net/Poechant
-
分享到:
相关推荐
通过定义.proto文件,我们可以描述数据结构,然后ProtoBuf编译器会为我们生成对应语言的代码,方便在不同语言间进行数据序列化和反序列化。 在SpringBoot应用中,我们将ProtoBuf作为Kafka的消息序列化方式。这需要...
protobuf的核心在于定义消息类型(.proto文件),然后生成对应的编程语言代码,用于序列化和反序列化数据。 ### 1. 序列化 序列化是将结构化的数据转换为二进制流的过程,便于在网络中传输或持久化存储。在...
谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据序列化协议,它能将结构化的数据序列化成字节流,方便在网络中进行高效、可靠的传输,同时也能将这些字节流还原为原来的结构化数据,即反...
描述中提到的“序列化反序列化”是protobuf的核心特性。序列化是将对象的状态转化为可存储或可传输的形式的过程,而反序列化则是将这种形式的数据恢复为原来的对象状态。在protobuf中,开发者定义数据结构的协议文件...
Protocol Buffers(Protobuf)是一种高效、跨平台的数据序列化协议,由Google开发。本Demo将展示如何在Unity中集成并使用Protobuf进行数据的序列化和反序列化操作。 首先,你需要了解什么是序列化和反序列化。序列...
在IT行业中,序列化和反序列化是两个关键的概念,特别是在跨平台通信、存储和传输数据时。Google Protobuf(Protocol Buffers)是一种广泛使用的工具,它能够将结构化的数据模型转换成二进制格式,以便高效地在网络...
Google Protobuf基于Qt开发序列化与反序列化用QUdpSocket传输并显示。实例。 具体可查看了解:https://blog.csdn.net/automoblie0/article/details/101363526
总之,"Unity5Google Protobuf解析工具"是针对跨平台开发的一个强大辅助,能够帮助开发者在Android和iOS平台上顺利进行泛型列表参数的序列化和反序列化操作,提升开发效率,优化游戏性能。无论你是新手还是经验丰富...
ProtoBuf支持多种语言,包括Java、C++、Python等,方便跨平台应用。 **ProtoBuf的工作原理** ProtoBuf通过定义.proto文件来描述数据结构,这些文件包含了各种数据类型的字段和它们的类型、顺序等信息。使用...
C#中可以使用Google.Protobuf库来实现ProtoBuf的序列化和反序列化。 在压缩和解压缩方面,示例可能使用了.NET Framework提供的`System.IO.Compression.GZipStream`或`System.IO.Compression.DeflateStream`类来对...
本篇文章将深入探讨在Unity5中如何使用Protocol Buffers(简称Protobuf)进行序列化和反序列化操作,以及它如何解决跨平台解析问题。 1. **什么是Protobuf?** Protocol Buffers是Google推出的一种高效的数据序列...
Protocol Buffers(protobuf)是Google推出的一种高效、跨平台的数据序列化协议,它可以替代XML、JSON等传统序列化方式,提供更小、更快、更简单的解决方案。 protobuf的工作原理是定义一种结构化的数据格式,即....
//打印反序列化生成的user2 Debug.Log (string.Format ("user2-> id:{0}, name:{1}, level:{2}", user2.id, user2.name, user2.level)); } } 作者:qufangliu 链接:https://www.jianshu.com/p/d9be1b3d2446 來...
1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator>>`,或者使用nlohmann/json库中的`to_json`和`from_...
- **跨平台性**:如果需要在多种编程语言之间交换数据,需要选择广泛支持的序列化格式。 测试工具对于评估不同序列化库的性能至关重要。例如,`message-master`可能是一个用于测试各种序列化框架性能的项目。它可以...
在编程世界中,序列化和反序列化是两个至关重要的概念,尤其是在C#这样的面向对象的语言中。它们允许我们将对象的状态转换为数据流,以便存储或传输,然后将这些数据流还原为原来的对象形式。本篇文章将深入探讨C#中...
protobuf,全称Protocol Buffers,是Google开发的一种数据序列化协议,用于高效地存储和传输结构化数据。它提供了一种语言无关、平台无关、高效且自动化的数据序列化方式,广泛应用于网络通信、数据库存储、配置文件...
在 Rust 生态中,还有其他特定领域的序列化库,如 rust-protobuf 和 rust-protobuf-json,它们专门处理 Google Protocol Buffers(protobuf)的序列化和反序列化。protobuf 是一种高效的跨语言数据交换格式,广泛...
在IT领域,序列化是将对象的状态转换为可存储或传输的形式的过程,而反序列化则是将这种形式恢复为原始对象。在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与...
Protocol Buffers是Google开源的一种数据序列化协议,它提供了语言无关、平台无关、可扩展的序列化结构数据的方式。相比XML或JSON,protobuf在序列化和反序列化时具有更高的效率和更小的存储空间。 在Android客户端...