zoukankan      html  css  js  c++  java
  • Avro和protobuf序列化

    序列化:
        进程间通信和永久存储
    
        特点:
            紧凑
            快速
            可扩展性
            支持互操作,跨语言
    
    
        java序列化:
            ObjectInput(Output)Stream
        
        hadoop的writable:
            PersonWritable        //java,非跨语言
    
        avro
            由hadoop之父doug cutting创建
    
    
    avro和hadoop序列化比较:
    ===============================
        writable:    不能跨语言
        avro:        跨语言,支持语言如下
    
        c/    
        cpp/    
        c#/    
        java/    
        js/    
        perl/
        php/    
        py/    
        py3/    
        ruby/    
    
    1、创建emp.avsc文件,内容如下
    
    {
        "namespace": "tutorialspoint.com",
        "type": "record",
        "name": "Emp",
        "fields": [
        {"name": "name", "type": "string"},
        {"name": "id", "type": "int"},
        {"name": "salary", "type": "int"},
        {"name": "age", "type": "int"},
        {"name": "address", "type": "string"}
        ]
    }
    
    2、将avro-1.8.2.jar和avro-tools-1.8.2.jar文件放在emp.avsc同级目录
    
    3、编译schema文件
        java -jar avro-tools-1.8.2.jar compile schema emp.avsc .
    
    4、查看生成文件
        tutorialspointcomEmp.java文件
    
        内容包括:
            构造函数
            builder
            get && set
            串行化和反串行化方法
    
    5、将此文件加载到ide,
        1、修改pom文件
            <dependency>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro</artifactId>
                <version>1.8.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-tools</artifactId>
                <version>1.8.2</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        2、新建包,名称tutorialspoint.com
    
        3、将Emp.java文件复制到包内
    
        4、将代码错误解决
    
    6、开始编写串行化代码
        @Test
        public void testAvroSerial() throws Exception {
            Emp e = new Emp();
            e.setId(10);
            e.setName("tom");
            e.setAge(20);
            e.setSalary(1000);
            e.setAddress("shahe");
            //初始化writer
            DatumWriter<Emp> dw = new SpecificDatumWriter<Emp>(Emp.class);
            //初始化文件写入器
            DataFileWriter<Emp> dfw = new DataFileWriter<Emp>(dw);
            //开始序列化文件
            dfw.create(Emp.SCHEMA$,new File("F:/avro/emp.avro"));
            //在序列文件中追加对象
            dfw.append(e);
            dfw.close();
            System.out.println("ok");
        }
    }
    
    
    7、测试java、hadoop、avro对1000000个对象串行化速度比对,大小比对
    
        java        writable        avro
    -------------------------------------------------------------
    size    4,883kb        23,438kb        13,677kb
    serial    3025ms        29410ms            1384ms
    
    
    8、编写反串行化代码
        @Test
        public void testAvroDeSerial() throws Exception {
            long start = System.currentTimeMillis();
            //初始化reader
            DatumReader<Emp> dr = new SpecificDatumReader<Emp>(Emp.class);
            //初始化文件阅读器
            DataFileReader<Emp> dfr = new DataFileReader<Emp>(new File("F:/avro/emp.avro"),dr);
            while (dfr.hasNext()){
                Emp emp = dfr.next();
                //System.out.println(emp.toString());
            }
            System.out.println(System.currentTimeMillis() - start);
        }
        
    
    
    9、测试java、hadoop、avro对1000000个对象反串行化速度比对
    
        java        writable        avro
    -------------------------------------------------------------
    size    4,883kb        23,438kb        13,677kb
    serial    3025ms        29410ms            1384ms    1802ms
    deser    3860ms        26232ms            1972ms  1689ms
    
    
    
    10、avro通过不生成代码,直接使用schema的方式对对象进行串行化
        
    
    
    
    Google Protobuf
    ================================    
        简单高效的串行化技术,由谷歌在2008年公开
    
        支持跨语言:
            Java, C++, and Python
            C, C#, Erlang, Perl, PHP, Ruby
    
        
    
    java    -    avro    -    pb(protobuf)
        
    javaBean    schema(json)    proto
    
    
    1、创建emp.proto自描述文件(非java文件)
    
        package tutorial; 
        option java_package = "tutorialspoint.com"; 
        option java_outer_classname = "Emp2"; 
        message Emp { 
            required int32 id = 1; 
            required string name = 2; 
            required int32 age = 3; 
            required int32 salary = 4; 
            required string address = 5; 
        }
    
    2、将emp.proto和protobufsrcprotoc.exe放在同一个文件夹(F:/avro)
        
    3、输入cmd,编译emp.proto
        protoc --java_out=. emp.proto
    
    4、将F:avro	utorialspointcom下的Emp2.java放置在idea中,包名tutorialspoint.com
  • 相关阅读:
    Tensorflow 2.0 学习资源
    SpagoBI 教程 Lesson 5: Creating a dashboard with BIRT and SpagoBI
    SpagoBI 教程 Lesson 4: BIRT Reports
    SpagoBI 教程 Lesson 3: Highchart Dashboards
    SpagoBI 教程 Lesson 2: OLAP with JPIVOT
    SpagoBI 教程 Lesson 1:Introduction and Installation
    Oracle system表空间满的暂定解决方法
    运算符重载_继承_多态_模版
    成员函数返回的是对象和引用的区别(转)
    String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类
  • 原文地址:https://www.cnblogs.com/zyde/p/8946197.html
Copyright © 2011-2022 走看看