`

java序列化/反序列化之xml、protobuf、protostuff 的比较与使用例子

 
阅读更多

4、protobuf简单教程

4.1、快速入门:

  下载.exe编译器——编写.proto文件——利用编译器编译.proto文件生成javabean——引用jar包——直接使用javabean自带的序列化、反序列化方法

 

1、下载针对java的.exe编译器

protobuf编译器官方下载地址:https://developers.google.com/protocol-buffers/docs/downloads

下载不了的:点我

 

2、编写.proto文件

package tutorial;
option java_package = "com.zjm.www.po";
option java_outer_classname = "Products2"; 
message Products22 { 
  required string s1 = 1;
  required string s2 = 2;
  required string s3 = 3;
  required string s4 = 4;
  required string s5 = 5;
  required string s6 = 6;
  required string s7 = 7;
  required string s8 = 8;
  required string s9 = 9;
  required int32 i10 = 10;
  required int32 i11 = 11;
  required int32 i12 = 12;
  required int32 i13 = 13;
  required int32 i14 = 14;
  required int32 i15 = 15;
  required int32 i16 = 16;
  required int32 i17 = 17;
  required int32 i18 = 18;
  required bool b19 = 19;
  required bool b20 = 20;
  required bool b21 = 21;
  required bool b22 = 22;
  required bool b23 = 23;
  required bool b24 = 24;
  required bool b25 = 25;
  required bool b26 = 26;
  required bool b27 = 27;
  repeated string list = 28;
}

View Code

其中的option java_package代表将要生成的javabean所有的包的包名

其中的option java_outer_classname代表要生成的javabean的类名

其中的message Products22可以理解为一个类似C语言的结构体,在生成的javabean中将变成一个内部类,一个.proto文件可以有无数个message 

proto支持的类型与修饰符可参考该博客:http://blog.sina.com.cn/s/blog_abea023b0101dxce.html

 

3、利用编译器编译.proto文件生成javabean

把.proto文件放在.exe同个目录下面,打开cmd,进入同目录下,执行命令:

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

假如.proto文件没有编写错误的话,成功后在同目录下即有javabean的类生成。

 

4、引用jar包

jar包地址pom.xml:

        <!-- protobuf -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.0.0-alpha-2</version>
        </dependency>

 

5、把刚刚生成的javabean复制到项目中,这里直接使用javabean自带的序列化、反序列化方法

刚刚生成的javabean为:Products2

序列化例子:

public List<byte[]> serializeProtoBufProductsList(
            List<Builder> builderList) {
        if(builderList == null) {
            System.out.println("【ProtoBufSerializeServiceImpl-serializeProtoBufProductsService】builderList==null");
        }
        long start = System.currentTimeMillis();
        List<byte[]> bytesList = new ArrayList<byte[]>();
        for(Products2.Products22.Builder p22Builder : builderList){
            Products2.Products22 p22 = p22Builder.build();
            byte[] bytes = p22.toByteArray();
            bytesList.add(bytes);
        }
        long end = System.currentTimeMillis();
        usedTime = end - start ;
        return bytesList;
    }

builder对象由来:com.zjm.www.po.Products2.Products22.Builder,即可有生成的javabean点出来。

反序列化例子:

    public List<Products22> deserializeProtoBufDataListToProducts22List(
            List<byte[]> bytesList) {
        long start = System.currentTimeMillis();
        List<Products22> list = new ArrayList<Products22>();
        for(byte[] b : bytesList) {
            try {
                list.add(Products2.Products22.parseFrom(b));
            } catch (InvalidProtocolBufferException e) {
                e.printStackTrace();
            }
        }
        long end = System.currentTimeMillis();
        usedTime = end - start;
        return list;
    }

拿出具体字段例子:

                Products22 p = Products2.Products22.parseFrom(b);
                String s1 = p.getS1();
                int i1 = p.getI10();
                boolean b1 = p.getB19();
                ProtocolStringList l = p.getListList();
                
                for(String s : l) {
                    
                }

 

5、protostuff简单教程

 5.1 快速入门

  引用jar包——学习语法——直接使用

 

1、引用jar包:

pom.xml:

        <!-- protostuff -->
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.0.7</version>
            <optional>true</optional>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.0.7</version>
            <optional>true</optional>
            <scope>provided</scope>
        </dependency>

 

2、javabean:

同上面xml的javabean

 

3、序列化例子:

public List<byte[]> serializeProtoStuffProductsList(List<Products> pList) {
        if(pList == null  ||  pList.size() <= 0) {
            return null;
        }
        long start = System.currentTimeMillis() ;
        List<byte[]> bytes = new ArrayList<byte[]>();
        Schema<Products> schema = RuntimeSchema.getSchema(Products.class);
        LinkedBuffer buffer = LinkedBuffer.allocate(4096);
        byte[] protostuff = null;
        for(Products p : pList) {
            try {
                protostuff = ProtostuffIOUtil.toByteArray(p, schema, buffer);
                bytes.add(protostuff);
            } finally {
                buffer.clear();
            }
        }
        long end = System.currentTimeMillis() ;
        this.userTime = end - start;
        return bytes;
    }

4、反序列化例子:

    public List<Products> deserializeProtoStuffDataListToProductsList(
            List<byte[]> bytesList) {
        if(bytesList == null || bytesList.size() <= 0) {
            return null;
        }
        long start = System.currentTimeMillis() ;
        Schema<Products> schema = RuntimeSchema.getSchema(Products.class);
        List<Products> list = new ArrayList<Products>();
        for(byte[] bs : bytesList) {
            Products product = new Products();
            ProtostuffIOUtil.mergeFrom(bs, product, schema);
            list.add(product);
        }
        long end = System.currentTimeMillis() ;
        this.userTime = end - start;
        return list;
    }

 

分享到:
评论

相关推荐

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

    本Demo将展示如何在Unity中集成并使用Protobuf进行数据的序列化和反序列化操作。 首先,你需要了解什么是序列化和反序列化。序列化是将对象的状态转换为可以存储或传输的数据格式的过程,而反序列化则是将这些数据...

    java序列化之protobuf

    开发者可以使用protobuf编译器将.proto文件编译成Java、C++、Python等语言的类,这些类提供了序列化和反序列化的方法。protobuf的优势在于它产生的代码执行速度快,序列化后的数据体积小,且具有良好的版本兼容性。 ...

    protobuf序列化和反序列化技术

    protobuf序列化和反序列化技术是大数据处理领域中不可或缺的一部分,尤其在实时大数据场景下,高效的数据传输和存储对性能有着直接影响。谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据...

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

    使用protobuf编译器,可以将.proto文件转换为特定语言的源代码,生成对应的序列化和反序列化接口。在Java中,这些接口通常是一些静态方法,用于将对象转换为字节流(序列化)和从字节流恢复对象(反序列化)。 **...

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

    总结来说,这个未知名称的库提供了与Google Protobuf类似的功能,专为C语言设计,允许开发者在XML、JSON和二进制之间灵活地序列化和反序列化数据结构。它对于需要在C环境中处理复杂数据交换的项目,尤其是那些关注...

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

    综上所述,这个压缩包提供了一种自定义实现的protobuf压缩解决方案,包括了protobuf的序列化和反序列化功能,以及可能的压缩算法实现。通过阅读协议文档和简介,我们可以更深入地了解数据格式和使用方法,而核心代码...

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

    消息序列化与反序列化是IT领域中一个关键的概念,特别是在分布式系统、网络通信和数据存储中。这个过程涉及到将对象或数据结构转换为可传输的格式,然后在接收端还原为原来的对象或数据结构。这允许不同系统之间有效...

    Java序列化_Java序列化结构_

    例如,JSON、XML、protobuf等轻量级序列化库提供了更高效、更安全的数据交换方式。 为了克服这些问题,开发者可以考虑使用第三方序列化库,如Google的Protocol Buffers (protobuf)、Apache Avro或Jackson的JSON序列...

    protobuf序列化JAVA使用的JAR包V3.15

    标题中的"protobuf序列化JAVA使用的JAR包V3.15"指的是protobuf的Java实现,版本为3.15,以JAR(Java Archive)的形式提供。JAR文件是Java平台特有的归档文件,包含了编译后的类文件和其他资源,使得开发者可以直接...

    protostuff序列化包

    1. **序列化框架**: Protostuff提供了一种灵活的方式来序列化和反序列化Java对象,支持多种数据格式,如JSON、XML、Protocol Buffers(protobuf)、YAML等。它不仅适用于基本类型,还支持自定义对象和复杂的对象图...

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

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

    XML文件序列化与反序列化

    在IT行业中,XML文件的序列化与反序列化是两个重要的概念,它们对于数据的存储、传输和处理起着关键作用。 **1. XML文件序列化** XML文件序列化是指将程序中的对象转换为XML格式的字符串或文件的过程。这个过程通常...

    序列化与反序列化

    在Java中,可以使用`java.io.Serializable`接口标记一个类为可序列化的,然后使用`ObjectOutputStream`来序列化对象,而`ObjectInputStream`则用于反序列化。 在描述的"序列化与反序列化Demo"中,我们可以推测这...

    Android-Android上的Java对象反序列化

    一、Java对象序列化与反序列化 1. **序列化**: 序列化是将Java对象转换为字节流的过程,以便于存储或传输。通过实现`java.io.Serializable`接口,一个Java对象可以获得序列化的能力。序列化不仅可以保存对象的状态...

    protobuf 序列化工具类

    本文将深入探讨protobuf的工作原理、使用方法、序列化与反序列化过程,以及如何使用protobuf工具类。 1. **protobuf工作原理** protobuf通过定义.proto文件来描述数据结构,这些文件包含了消息类型、字段、字段...

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

    在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与ProtoBuf相关的`proto.exe`工具。 1. Gson(Google Gson): Gson是由Google提供的Java库,用于将Java对象转换为...

    java序列化和反序列化1

    - 考虑使用其他序列化框架,如protobuf、JSON或XML,它们可能提供更好的性能和更小的序列化数据大小。 总之,Java的序列化和反序列化是处理对象持久化和网络传输的关键技术,但在使用过程中需要注意安全性和性能...

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

    在C#中,我们可以使用System.Xml.Serialization命名空间中的XmlSerializer类来实现XML序列化和反序列化。通过创建一个XmlSerializer实例,指定要序列化的类型,然后调用其Serialize方法,即可将对象转换为XML字符串...

    protobuf例子

    标题中的"protobuf例子"指的是Google开发的一种数据序列化协议缓冲区(Protocol Buffers)的示例。Protocol Buffers是一种高效、灵活且易于使用的结构化数据序列化方法,类似于XML、JSON,但更小、更快、更简单。它...

Global site tag (gtag.js) - Google Analytics