序列化框架 JDK&MessagePack&ProtoBuf

18 篇文章 0 订阅
名称支持语言性能
Jdk SerializableJava速度快,文件大
MessagePack市面上主流编程语言都支持速度慢,文件小
Google ProtoBuf市面上主流编程语言都支持速度快,文件小
kryo  

 

 

 

 

 

目录

1、maven配置

2、项目结构

3、各文件

4、结果


1、maven配置

<properties>

        <grpc.version>1.18.0</grpc.version>
        <protobuf.version>3.5.1</protobuf.version>
    </properties>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <!--JDK版本-->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.1</version>
                <configuration>
                    <!--<protoSourceRoot>${basedir}/src/main/com/busy/protobean</protoSourceRoot>默认的proto文件路径-->
                    <!--Protobuf compiler artifact specification, in groupId:artifactId:version[:type[:classifier]] format. When this parameter is set, the plugin attempts to resolve the specified artifact as protoc executable.-->
                    <!--os.detected.classifier 变量来源:https://github.com/trustin/os-maven-plugin-->
                    <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
                    </protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                    </pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal> <!--按照指定的插件进行编译,即按照GRPC协议编译protob文件-->
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.msgpack</groupId>
            <artifactId>msgpack</artifactId>
            <version>0.6.12</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>${grpc.version}</version>
        </dependency>
    </dependencies>

2、项目结构

3、各文件

import java.io.Serializable;

public class JdkTestBean implements Serializable {

    private static final long serialVersionUID = 3947438471185945980L;

    private String var1;

    private String var2;

    private String var3;

    public JdkTestBean() {
    }

    public JdkTestBean(String var1, String var2, String var3) {
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;
    }

    @Override
    public String toString() {
        return "JdkTestBean{" +
                "var1='" + var1 + '\'' +
                ", var2='" + var2 + '\'' +
                ", var3='" + var3 + '\'' +
                '}';
    }
}
import org.msgpack.annotation.Message;

@Message
public class MsgPackTestBean {

    private String var1;

    private String var2;

    private String var3;

    public MsgPackTestBean() {
    }

    public MsgPackTestBean(String var1, String var2, String var3) {
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;
    }

    @Override
    public String toString() {
        return "MsgPackTestBean{" +
                "var1='" + var1 + '\'' +
                ", var2='" + var2 + '\'' +
                ", var3='" + var3 + '\'' +
                '}';
    }
}
public class ProtoBufTestBean {

    private String var1;

    private String var2;

    private String var3;

    public ProtoBufTestBean() {
    }

    public ProtoBufTestBean(String var1, String var2, String var3) {
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;
    }

    @Override
    public String toString() {
        return "JdkTestBean{" +
                "var1='" + var1 + '\'' +
                ", var2='" + var2 + '\'' +
                ", var3='" + var3 + '\'' +
                '}';
    }
}
syntax = "proto3";
option java_package = "com.busy.proto";
option java_outer_classname = "TestProtoModel";

message ProtoBufTestBean {
     string var1 = 111;
     string var2 = 222;
     string var3 = 333;
}
import com.busy.bean.JdkTestBean;
import com.busy.bean.MsgPackTestBean;
import com.busy.proto.TestProtoModel;
import org.msgpack.MessagePack;

import java.io.*;

public class TestMain {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            jdkSerialize();
            jdkDeserialize();
        }
        System.out.println(System.currentTimeMillis()-start);
        start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            msgPackSerialize();
            msgPackDeserialize();
        }
        System.out.println(System.currentTimeMillis()-start);
        start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            protoBufSerialize();
            protoBufDeserialize();
        }
        System.out.println(System.currentTimeMillis()-start);
    }

    public static void protoBufSerialize() {
        try {
            TestProtoModel.ProtoBufTestBean.Builder builder = TestProtoModel.ProtoBufTestBean.newBuilder();
            builder.setVar1("111");
            builder.setVar2("222");
            builder.setVar3("333");
            TestProtoModel.ProtoBufTestBean protoBufTestBean = builder.build();
            byte[] raw = protoBufTestBean.toByteArray();
            FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\protoBuf.txt"));
            fileOutputStream.write(raw);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void protoBufDeserialize() {
        try {
            TestProtoModel.ProtoBufTestBean protoBufTestBean = TestProtoModel.ProtoBufTestBean.parseFrom(new FileInputStream("D:\\protoBuf.txt"));
            //System.out.println(protoBufTestBean.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void jdkSerialize() {
        try {
            JdkTestBean jdkTestBean = new JdkTestBean("111", "222", "333");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\jdk.txt"));
            objectOutputStream.writeObject(jdkTestBean);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void jdkDeserialize() {
        try {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\jdk.txt"));
            JdkTestBean jdkTestBean = (JdkTestBean) objectInputStream.readObject();
            //System.out.println(jdkTestBean.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void msgPackSerialize() {
        try {
            MsgPackTestBean msgPackTestBean = new MsgPackTestBean("111", "222", "333");
            MessagePack messagePack = new MessagePack();
            byte[] raw = messagePack.write(msgPackTestBean);
            FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\msgPack.txt"));
            fileOutputStream.write(raw);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void msgPackDeserialize() {
        try {
            MessagePack messagePack = new MessagePack();
            MsgPackTestBean msgPackTestBean = messagePack.read(new FileInputStream("D:\\msgPack.txt"), MsgPackTestBean.class);
            //System.out.println(msgPackTestBean.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4、结果

运行耗时:
JDK:423
MsgPack:6628
ProtoBuf:285

单文件大小:
JDK:116字节
MsgPack:13字节
ProtoBuf:18字节

java的static变量是不会被序列化的,但是在同一个虚拟机中反序列化是能拿得到值,两个虚拟机直接读取序列化的文件是读取不到static的值得,因为java序列化是针对堆内存而言的,但是static变量是保存在方法区的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值