`
Poechant
  • 浏览: 229652 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24330
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22105
社区版块
存档分类
最新评论

Google Protobuf Primer (1) 实现跨平台跨语言的序列化/反序列化

 
阅读更多

Google Protobuf Primer (1) 实现跨平台跨语言的序列化/反序列化

  • 作者:柳大·Poechant
  • 邮箱:zhongchao.ustc#gmail.com (#->@)
  • 博客:Blog.CSDN.net/Poechant
  • 日期:March 15th, 2012

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

  1. 环境:搭建 Google Protobuf 的开发环境;
  2. 协议:根据 Google Protobuf 格式要求,创建 Protocol 文件;
  3. 生成:利用 protoc 编译生成所定义的 Protocol 的类源文件与头文件;
  4. 应用:编写利用所生成的 Protocol 的类源文件与头文件;
  5. 编译:编译所编写的应用的源文件与头文件,注意头文件路径、库文件路径及库;
  6. 运行。

Reference

  1. http://stackoverflow.com/questions/8875867/linking-errors-when-using-proto-tutorial
  2. http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
  3. http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/overview.html

-

Happy Coding, enjoy sharing!

转载请注明来自“柳大的CSDN博客”:Blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    SpringBoot整合kafka及ProtoBuf实现跨平台跨语言的信息交互

    通过定义.proto文件,我们可以描述数据结构,然后ProtoBuf编译器会为我们生成对应语言的代码,方便在不同语言间进行数据序列化和反序列化。 在SpringBoot应用中,我们将ProtoBuf作为Kafka的消息序列化方式。这需要...

    protobuf常用序列化和反序列化API

    protobuf的核心在于定义消息类型(.proto文件),然后生成对应的编程语言代码,用于序列化和反序列化数据。 ### 1. 序列化 序列化是将结构化的数据转换为二进制流的过程,便于在网络中传输或持久化存储。在...

    protobuf序列化和反序列化技术

    谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据序列化协议,它能将结构化的数据序列化成字节流,方便在网络中进行高效、可靠的传输,同时也能将这些字节流还原为原来的结构化数据,即反...

    自己实现的protobuf 压缩类,并能序列化反序列化

    描述中提到的“序列化反序列化”是protobuf的核心特性。序列化是将对象的状态转化为可存储或可传输的形式的过程,而反序列化则是将这种形式的数据恢复为原来的对象状态。在protobuf中,开发者定义数据结构的协议文件...

    Unity 中使用Protobuf进行序列化和反序列化的Demo

    Protocol Buffers(Protobuf)是一种高效、跨平台的数据序列化协议,由Google开发。本Demo将展示如何在Unity中集成并使用Protobuf进行数据的序列化和反序列化操作。 首先,你需要了解什么是序列化和反序列化。序列...

    类似 google protobuf,用于序列化/反序列化 c 结构体

    在IT行业中,序列化和反序列化是两个关键的概念,特别是在跨平台通信、存储和传输数据时。Google Protobuf(Protocol Buffers)是一种广泛使用的工具,它能够将结构化的数据模型转换成二进制格式,以便高效地在网络...

    Google Protobuf基于Qt开发序列化与反序列化用QUdpSocket传输并显示。实例。

    Google Protobuf基于Qt开发序列化与反序列化用QUdpSocket传输并显示。实例。 具体可查看了解:https://blog.csdn.net/automoblie0/article/details/101363526

    Unity5Google Protobuf解析工具,支持android/ios泛型列表参数正反序列化

    总之,"Unity5Google Protobuf解析工具"是针对跨平台开发的一个强大辅助,能够帮助开发者在Android和iOS平台上顺利进行泛型列表参数的序列化和反序列化操作,提升开发效率,优化游戏性能。无论你是新手还是经验丰富...

    ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化示例代码.rar

    ProtoBuf支持多种语言,包括Java、C++、Python等,方便跨平台应用。 **ProtoBuf的工作原理** ProtoBuf通过定义.proto文件来描述数据结构,这些文件包含了各种数据类型的字段和它们的类型、顺序等信息。使用...

    C#中使用二进制和ProtoBuf分别进行序列化、反序列化、压缩、解压缩对比测试示例源码.zip

    C#中可以使用Google.Protobuf库来实现ProtoBuf的序列化和反序列化。 在压缩和解压缩方面,示例可能使用了.NET Framework提供的`System.IO.Compression.GZipStream`或`System.IO.Compression.DeflateStream`类来对...

    在Unity5中Protobuf的序列化和反序列化

    本篇文章将深入探讨在Unity5中如何使用Protocol Buffers(简称Protobuf)进行序列化和反序列化操作,以及它如何解决跨平台解析问题。 1. **什么是Protobuf?** Protocol Buffers是Google推出的一种高效的数据序列...

    java序列化之protobuf

    Protocol Buffers(protobuf)是Google推出的一种高效、跨平台的数据序列化协议,它可以替代XML、JSON等传统序列化方式,提供更小、更快、更简单的解决方案。 protobuf的工作原理是定义一种结构化的数据格式,即....

    Unity 反序列化工具Protobuf

    //打印反序列化生成的user2 Debug.Log (string.Format ("user2-&gt; id:{0}, name:{1}, level:{2}", user2.id, user2.name, user2.level)); } } 作者:qufangliu 链接:https://www.jianshu.com/p/d9be1b3d2446 來...

    C++ JSON 序列化与反序列化

    1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator&gt;&gt;`,或者使用nlohmann/json库中的`to_json`和`from_...

    消息序列化/反序列化的基准和用法

    - **跨平台性**:如果需要在多种编程语言之间交换数据,需要选择广泛支持的序列化格式。 测试工具对于评估不同序列化库的性能至关重要。例如,`message-master`可能是一个用于测试各种序列化框架性能的项目。它可以...

    C# 各种序列化和反序列化

    在编程世界中,序列化和反序列化是两个至关重要的概念,尤其是在C#这样的面向对象的语言中。它们允许我们将对象的状态转换为数据流,以便存储或传输,然后将这些数据流还原为原来的对象形式。本篇文章将深入探讨C#中...

    protobuf 序列化工具类

    protobuf,全称Protocol Buffers,是Google开发的一种数据序列化协议,用于高效地存储和传输结构化数据。它提供了一种语言无关、平台无关、高效且自动化的数据序列化方式,广泛应用于网络通信、数据库存储、配置文件...

    Rust 字节流序列化/反序列化库

    在 Rust 生态中,还有其他特定领域的序列化库,如 rust-protobuf 和 rust-protobuf-json,它们专门处理 Google Protocol Buffers(protobuf)的序列化和反序列化。protobuf 是一种高效的跨语言数据交换格式,广泛...

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    在IT领域,序列化是将对象的状态转换为可存储或传输的形式的过程,而反序列化则是将这种形式恢复为原始对象。在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与...

    netty protobuf序列化 推送 android客户端

    Protocol Buffers是Google开源的一种数据序列化协议,它提供了语言无关、平台无关、可扩展的序列化结构数据的方式。相比XML或JSON,protobuf在序列化和反序列化时具有更高的效率和更小的存储空间。 在Android客户端...

Global site tag (gtag.js) - Google Analytics