Google protobuf序列化以及反序列化

  序列化的目的是将对象持久化到硬盘或者用于网络传输。java也提供了序列化技术,非常简单,只要实现Serializable接口即可。如下:

public class commonService implements Serializable {

    private static final long serialVersionUID = 1L;
}

  这种方式有以下几个缺点:(1)无法跨语言    (2)序列化的码流太大   (3)序列化的性能差

  下面我测试一下序列化一个对象后的大小,代码如下:

public class TestBuf implements Serializable {

    private int id;
    private String url;
    private ArrayList<String> name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public ArrayList<String> getName() {
        return name;
    }

    public void setName(ArrayList<String> name) {
        this.name = name;
    }
}
 public static void main(String[]args)throws IOException{

        TestBuf testBuf1 = new TestBuf();
        testBuf1.setId(1);
        testBuf1.setUrl("www.baidu.com");
        ArrayList<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        testBuf1.setName(list);
        ByteArrayOutputStream  outputStream = new ByteArrayOutputStream();
        ObjectOutputStream outputStream1 = new ObjectOutputStream(outputStream);
        outputStream1.writeObject(testBuf1);
        System.out.println("Serializable====="+outputStream.toByteArray().length);
    }

  运行结果如下:

  接下来我们使用google protobuf,序列化同一个对象,看看序列化后的对象大小。

   (1)首先下载 protoc.exe和protobuf-java-2.5.0.jar ,地址http://download.csdn.net/detail/yangheng362/8516923

  (2)编写proto文件,这里命名为test.proto,代码如下:

package protobuf;
option java_package = "com.test.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf  {
  required int32 ID = 1;
  optional string Url = 2;
  repeated string name=3;
}

  option java_package = "com.test.protobuf"; 就是生成的路径。

  option java_outer_classname = "FirstProtobuf"; 就是生成的类名称。

  required\optional\repeated就是一些修饰符,分别是必填,可选以及集合。

  (3)将文件放在解压的protoc.exe同级目录下,启动cmd控制台,执行代码如下:

protoc ./test.proto --java_out=./

  (4)把生成的文件FirstProtobuf.java拷到新建的java目录下, 引入jar包 protobuf-java-2.5.0.jar

  (5)测试序列化以及反序列化,代码如下:

public class TestProtobuf {

    public static void main(String[]args)throws IOException{
        FirstProtobuf.testBuf.Builder builder = FirstProtobuf.testBuf.newBuilder();
        builder.setID(1);
        builder.setUrl("www.baidu.com");
        builder.addName("aaa");
        builder.addName("bbb");
        builder.addName("ccc");
        FirstProtobuf.testBuf info = builder.build();
        byte[] result = info.toByteArray();
        System.out.println("google protobuf====="+result.length);
        FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);
        System.out.println(testBuf);
    }

}

  显示结果如下:同样的对象,使用java自带的序列化的大小为201字节,而google的protobuf只有32个字节。

  

  参考地址:http://www.tuicool.com/articles/EJrQRr3

时间: 2024-10-03 17:52:26

Google protobuf序列化以及反序列化的相关文章

google protobuf序列化原理

一个message,序列化时首先就算这个message所有filed序列化需要占用的字节长度,计算这个长度是非常简单的,因为protobuf中每种类型的filed所占用的字节数是已知的(bytes.string除外),只需要累加即可.这个长度就是serializedSize,32为integer,在protobuf的某些序列化方式中可能使用varint32(一个压缩的.根据数字区间,使用不同字节长度的int): 此后是filed列表输出,每个filed输出包含int32(tag,type)和va

python protobuf序列化repeated运用

下面是proto描述文件的定义 message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = H

Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)

1.google的protobuf是什么? 用于rpc的自定义协议,体积更小,序列化和反序列化的第三方库,和apache thrift是同一种技术. 2.rpc库的介绍? (1) RMI    remote  method  invocation   广泛用于EJB,实际上是一种跨机器的调用,通过网络传输,调用方A调用序列化字节码传输到B机器反序列化,调用B的方法,B回传结果后序列化网路传输,A反序列化成最终结果. 限制 : 只针对于Java语言. 特点 :网络传输代码自动生成   client

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

protobuf 是 google的一个开源项目,可用于以下两种用途: (1)数据的存储(序列化和反序列化),类似于xml.json等: (2)制作网络通信协议. 源代码下载地址:https://github.com/mgravell/protobuf-net: 开源项目地址如下:https://code.google.com/p/protobuf-net/. protobuf 工具类 DataUtils.cs 代码如下: nuget 包 Install-Package ServiceStack

[Go] 使用protobuf进行序列化和反序列化

先定义消息类型 orders.proto syntax = "proto2"; package message; message Orders { required int32 order_id=1; required string title=2; } 在GOPATH创建目录和编译这个消息类型输出到该目录,包名是message mkdir $GOPATH/src/message;protoc --go_out $GOPATH/src/message orders.proto 编写go

google protobuf学习笔记一:使用和原理

一.什么是protobuf protobuf全称Google Protocol Buffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML或者JSON差不多,也就是把某种数据结构的信息,以某种格式(XML,JSON)保存起来,protobuf与XML和JSON不同在于,protobuf是基于二进制的.主要用于数据存储.传输协议格式等场合.那既然有了XML等工具,为什么还要开发protobuf呢?主要是因为性能,包括时间开销和空间开销: 1.时间开销:XM

google protobuf初体验

最近在读别人代码的时候发现一个的东西,名字叫protobuf, 感觉挺好用的,写在这里,留个记录.那么什么是protobuf 呢?假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件.他们用于 RPC 系统和持续数据存储系统. Protocol Buffers 是一种轻便高效的结构化

序列化和反序列化[转]

http://tech.meituan.com/serialization_vs_deserialization.html #摘要序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中:另一方面,它们会以其他更容易理解的概念出现,例如加密.持久化.然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.恰当的序列化协议不仅可以提高系统的通用性.强健性.安全性.优化系统性

比较跨语言通讯框架:Apache Thrift和Google Protobuf

前两天想在微博上发表一个观点:在现在的技术体系中,能用于描述通讯协议的方式很多,xml,json,protobuf,thrift,如果在有如此众多选择的基础上,在设计系统时,还自造协议,自己设计协议类型和解析方式,那么我只能说,您真的落后了,不是技术上,而是思想上.对于xml,和json我们不做过多描述了,参考相关文档就可以了.特别是json,如今在 web系统,页游系统的前后台通讯中,应用非常广泛.本文将重点介绍两种目前在大型系统中,应用比较普遍的两种通讯框架,thrift和Protobuf,