名称 | 支持语言 | 性能 |
Jdk Serializable | Java | 速度快,文件大 |
MessagePack | 市面上主流编程语言都支持 | 速度慢,文件小 |
Google ProtoBuf | 市面上主流编程语言都支持 | 速度快,文件小 |
kryo |
目录
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变量是保存在方法区的