本文共 7300 字,大约阅读时间需要 24 分钟。
Java 本身(Serializable) 对象的序列化与反序列化
1.定义对象(与上节中提到的ProtoBuf中定义的employee字段是相同的)
package javaserializable;import java.io.Serializable;public class Employee implements Serializable{ private long emploee_id ; private String first_name; private String last_name; private int age; public Employee(long emploee_id ,String first_name,String last_name,int age){ this.emploee_id=emploee_id; this.first_name=first_name; this.last_name=last_name; this.age=age; } public long getEmploee_id() { return emploee_id; } public String getFirst_name() { return first_name; } public String getLast_name() { return last_name; } public int getAge() { return age; }}
2.对象的序列化与反序列化操作
package javaserializable;import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;import java.io.ByteArrayInputStream;import java.io.DataOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.Arrays;/** * Jdk提供对象序列化与反序列化的机制 */public class JSMain { public static void main(String[] args) throws Exception{ //序列化 ByteOutputStream byteOutputStream=new ByteOutputStream(); ObjectOutputStream dataOutputStream=new ObjectOutputStream(byteOutputStream); Employee employee =new Employee(1000,"Gam","Xie",30); dataOutputStream.writeObject(employee); byte[] employeeBytes = byteOutputStream.getBytes(); System.out.println("byte length="+employeeBytes.length+",conent="+ Arrays.toString(employeeBytes)); //反序列化 ByteArrayInputStream byteInputStream=new ByteArrayInputStream(employeeBytes); ObjectInputStream objectInputStream=new ObjectInputStream(byteInputStream); Employee newEmployee=(Employee)objectInputStream.readObject(); System.out.println("parse employeeId="+newEmployee.getEmploee_id()); System.out.println("parse first name="+newEmployee.getFirst_name()); System.out.println("parse last name="+newEmployee.getLast_name()); System.out.println("parse age="+newEmployee.getAge()); }}
3.Jdk 序列化与ProtoBuf序列结果的比较
<a>大小:
protobuf: 15
byte length=15,conent=[8, -24, 7, 18, 3, 71, 97, 109, 26, 3, 88, 105, 101, 32, 30]
Jdk:1024
byte length=1024,conent=[-84, -19, 0, 5, 115, 114, 0, 25, 106, 97, 118, 97, 115, 101, 114, 105, 97, 108, 105, 122, 97, 98, 108, 101, 46, 69, 109, 112, 108, 111, 121, 101, 101, 127, -34, -4, -19, 20, 117, 51, -68, 2, 0, 4, 73, 0, 3, 97, 103, 101, 74, 0, 10, 101, 109, 112, 108, 111, 101, 101, 95, 105, 100, 76, 0, 10, 102, 105, 114, 115, 116, 95, 110, 97, 109, 101, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 0, 9, 108, 97, 115, 116, 95, 110, 97, 109, 101, 113, 0, 126, 0, 1, 120, 112, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 3, -24, 116, 0, 3, 71, 97, 109, 116, 0, 3, 88, 105, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
<b>对象序列时间的对比(1000次对象所花费的时间)
protobuf:
long beginTime=System.currentTimeMillis(); for(int i=0;i<1000;i++) { EmployeeModule.Employee.Builder builder = EmployeeModule.Employee.newBuilder(); builder.setEmploeeId(1000); builder.setFirstName("Gam"); builder.setLastName("Xie"); builder.setAge(30); EmployeeModule.Employee employee = builder.build(); byte[] bytes = employee.toByteArray(); } System.out.println("time="+(System.currentTimeMillis()-beginTime)); 结果时间 time=289
Jdk:
//序列化 long beginTime=System.currentTimeMillis(); for(int i=0;i<1000;i++) { ByteOutputStream byteOutputStream = new ByteOutputStream(); ObjectOutputStream dataOutputStream = new ObjectOutputStream(byteOutputStream); Employee employee = new Employee(1000, "Gam", "Xie", 30); dataOutputStream.writeObject(employee); byte[] employeeBytes = byteOutputStream.getBytes(); } System.out.println("time="+(System.currentTimeMillis()-beginTime));结果 time=356
大致上可以看出:Protobuf 在序列化字节大小与序列化所花费的时间上要比JDK的性能要好
后续分析两者差异所在?
转载地址:http://nwadi.baihongyu.com/