zoukankan      html  css  js  c++  java
  • 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"; 就是生成的类名称。

      requiredoptional epeated就是一些修饰符,分别是必填,可选以及集合。

      (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

  • 相关阅读:
    百度指数感想
    冲刺贡献分
    冲刺三
    通过myEclipse创建hibernate的实体类
    并发处理
    数据库设计原则(转载)
    Extjs学习
    关于oracle存储过程需要注意的问题
    oracle存储过程
    十大编程算法
  • 原文地址:https://www.cnblogs.com/gdpuzxs/p/7081145.html
Copyright © 2011-2022 走看看