Google Protobuf - 实现跨平台跨语言的序列化/反序列化

转载 2012年03月28日 18:39:24

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


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


google protobuf入门(序列化和反序列化)

ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。谷歌自己内部很多程序之间的通信协议都用了ProtoBuf。 下面介绍的是...
  • paul342
  • paul342
  • 2016年05月19日 17:09
  • 4694

Java数据通讯中使用Google Protobuf实现序列化与反序列化

一、.什么是protocol buffer        ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据...
  • zmx729618
  • zmx729618
  • 2017年01月11日 10:05
  • 1171

Google开源协议Protobuf的简介及其序列化原理

protobuf介绍及其序列化原理什么是probobuf、作用是什么:   Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据...
  • Chengzi_comm
  • Chengzi_comm
  • 2016年11月17日 14:13
  • 7777

高性能序列化工具Google Protobuf的使用

高性能序列化工具Google Protobuf的使用DEMO
  • zhaowen25
  • zhaowen25
  • 2014年10月21日 19:05
  • 2049

unity3d中ProtoBuf的序列化和反序列化c#

using System; using System.IO; using ProtoBuf; namespace SensorServerPro { class Common { ...
  • zscjob
  • zscjob
  • 2015年10月28日 20:35
  • 1413

protobuf序列化/反序列化性能及问题

为了tensorflow项目要求测试protobuf序列化/反序列化的性能,测试过程及测试结果如下: 一. 测试环境 python 2.7 + proto3 二. 测试方法 1. 自定义一个prot...
  • s_sunnyy
  • s_sunnyy
  • 2017年04月05日 14:18
  • 3120

google protocl buffer 序列化和反序列化的一个例子

google protocl buffer 序列化和反序列化的一个例子
  • hzhxxx
  • hzhxxx
  • 2013年09月25日 10:15
  • 3734

浅谈JAVA序列化与反序列化

序列化介绍 对象是由行为和状态组成的,序列化代表我们可以将一个对象的状态转化成数据流,可以通过网络传输,也可以存储成一个文件或者数据库中,同样可以把数据流反序列化成对象。 JAVA序列化 Se...
  • connect_me
  • connect_me
  • 2017年03月16日 20:29
  • 380

C# 使用 protobuf 进行对象序列化与反序列化

本文永久地址:http://www.omuying.com/article/148.aspx,【文章转载请注明出处!】 protobuf 是 google的一个开源项目,可用于以下两种用途:(1...
  • laipixiaoxi
  • laipixiaoxi
  • 2015年12月17日 08:55
  • 2836

C++序列化方法 参考google protobuf

参考google protobuf而得来的一种更简化的序列化方法,易扩展,也可以在现有代码扩展。...
  • whhlpo
  • whhlpo
  • 2015年09月23日 16:17
  • 775
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Google Protobuf - 实现跨平台跨语言的序列化/反序列化
举报原因:
原因补充:

(最多只允许输入30个字)