序列化与反序列化
- 序列化目的
- 序列化:将对象的状态信息转换为可以存储或传输的形式的过程。
- 反序列化:将磁盘或者网络传输过来的信息转换为对象。
- 序列化标准
- 是否支持跨语言
- 编码后的码流大小
- 序列化过程的性能
java序列化与反序列化Demo
package org.apache.zookeeper.demo;
import java.io.Serializable;
/**
* Created by caomaoboy 2019-11-14
**/
public class Student implements Serializable {
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", age=" + age +
", grade=" + grade +
'}';
}
public Student(String username, int age, int grade){
this.username = username;
this.age = age;
this.grade = grade;
}
private static final long serialVersionUID = 1L;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public long getGrade() {
return grade;
}
public void setGrade(long grade) {
this.grade = grade;
}
private String username;
private int age;
private long grade;
}
public class SerialDemo {
@Test
public void test() throws IOException, ClassNotFoundException {
Student student = new Student("zhangsan",13,6);
ObjectOutputStream oos;
String path="demo.txt";
oos = new ObjectOutputStream(new FileOutputStream(new File(path)));
oos.writeObject(student);
System.out.println("---------java serialize---------");
ObjectInputStream ois;
ois = new ObjectInputStream(new FileInputStream(new File(path)));
Student obj;
obj = (Student) ois.readObject();
System.out.println("ojg = "+obj.toString());
}
}
从上图可以看到,类的序列化文件存储了包括。
- 类的全路径
- 类的名称
- 成员变量名称
- 成员变量的值
Jute序列化
@Test
public void tesjute(){
Student student = new Student("zhangsan",13,6);
ObjectOutputStream oos;
String path="demojute.txt";
InputStream inputStream;
OutputStream outputstream ;
try {
outputstream= new FileOutputStream(new File(path));
BinaryOutputArchive binaryOutputArchive =BinaryOutputArchive.getArchive(outputstream);
binaryOutputArchive.writeString(student.getUsername(),"name");
binaryOutputArchive.writeInt(student.getAge(),"age");
binaryOutputArchive.writeLong(student.getGrade(),"grade");
outputstream.flush();
outputstream.close();
InputStream inputstream;
inputstream = new FileInputStream(new File(path));
BinaryInputArchive binaryInputArchive =BinaryInputArchive.getArchive(inputstream);
System.out.println("username=" + binaryInputArchive.readString("name"));
System.out.println("userage=" + binaryInputArchive.readInt("age"));
System.out.println("usergrade=" + binaryInputArchive.readLong("grade"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Zookeeper使用的是Jute反序列化。经过反序列化后的存储
使用java 序列化的文件
可以看出zookeeper使用了更少的字节 只保留了序列化字段的值,这样会有更好的性能。
总结
- Java序列化
- 只支持java
- 序列化后包含的 全路径名称、各成员变量名称、成员变量值
- Jute序列化
- 支持跨语言(C++ C# java等)
- 序列化后只包含成员变量值 (序列化性能更好)