序列化和反序列化
简述:
Java序列化是指把Java对象转换为字节序列的过程,即把一个对象变为二进制的数据流的一种方法,通过序列化可以方便地实现对象的传输和存储;Java反序列化是指把字节序列恢复为Java对象的过程。
student.java:
package com.wu.Bean;
import java.io.Serializable;
public class Student implements Serializable{
private static final long serialVersionUID = -4307074831333148448L;
private String name;
private int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return "姓名:"+name+",年龄:"+age;
}
}
StudentSerializable.java:
package com.wu.SerializableDemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import com.wu.Bean.Student;
public class StudentSerializable {
private static final String PATH = "C:"+File.separator+"Users"+File.separator+"Administrator"
+ File.separator+"Desktop"+File.separator+"代码集合"+File.separator+"Java"+File.separator+"studentserializable.txt";
public StudentSerializable(String name,Integer age) {
Student s = new Student(name,age);
File file = new File(PATH);
if(!file.exists()) {
try {
file.createNewFile();
}catch(IOException e) {
e.printStackTrace();
}
}
// student实例序列化过程
try {
FileOutputStream fos = new FileOutputStream(file); //创建文件输出流对象
ObjectOutputStream obj = new ObjectOutputStream(fos); // 将文件输出流对象转化为对象输出流对象
obj.writeObject(s); // 将student实例写入对象输出流
obj.flush(); // 刷新缓冲区
obj.close(); // 关闭对象输出流对象
fos.close(); // 关闭文件输出流对象
}catch(IOException e) {
e.printStackTrace();
}
}
}
StudentDeserializable.java:
package com.wu.SerializableDemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import com.wu.Bean.Student;
public class StudentDeserializable {
private static final String PATH = "C:"+File.separator+"Users"+File.separator+"Administrator"
+ File.separator+"Desktop"+File.separator+"代码集合"+File.separator+"Java"+File.separator+"studentserializable.txt";
public StudentDeserializable() {
File file = new File(PATH);
if(!file.exists()) {
try {
file.createNewFile();
}catch(IOException e) {
e.printStackTrace();
}
}
try {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream obj = new ObjectInputStream(fis);
Student s = (Student) obj.readObject();
System.out.println(s);
obj.close();
fis.close();
}catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
TestDemo.java:
package com.wu.SerializableDemo;
import org.junit.Test;
public class TestDemo {
@Test
public void test() {
// 序列化测试
new StudentSerializable("张三",20);
// 反序列化测试
new StudentDeserializable();
}
}
此时在相应的目录下会生成一个txt文件,这里面的内容和class文件的一样:
结果:
transient关键字
为了保证对象序列化的高效传输,就需要防止一些不必要成员属性的序列化处理
// 对student类的age属性添加transient关键字
private static final long serialVersionUID = -4307074831333148448L;
private String name; // 此属性可被序列化
private transient int age; // 此属性不被序列化
结果: