1. Java 原生序列化
- 序列化:把内存中数据写入文件中
- 反序列化:从文件中读取数据到内存中
- 使用流传输对象的过程称为序列化、反序列化
2. 序列化使用
// 必须实现 Serializable 接口,否则会报错 java.io.NotSerializableException
public class Student implements Serializable {
// 序列化版本号,保证序列化和反序列化的是同一个类
private static final long serialVersionUID = -3881208742057626511L;
}
// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("src/main/resources/student.bin"));
Student student = new Student("tinyspot", 20);
out.writeObject(student);
out.close();
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/main/resources/student.bin"));
Student student = (Student) ois.readObject();
ois.close();
System.out.println(JSON.toJSONString(student));
2.1 绕过 transient
会通过反射调用 readObject(java.io.ObjectInputStream s) 和 writeObject(java.io.ObjectOutputStream s)
public class User implements Serializable {
private static final long serialVersionUID = -5324601100478775753L;
private transient String name;
private Integer age;
private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject();
s.readObject();
}
private void writeObject(java.io.ObjectOutputStream s) throws IOException {
s.defaultWriteObject();
s.writeObject(name);
}
}
3. 示例
public static void main(String[] args) {
ISerializer serializer = new FileSerializer();
User user = new User("Tinyspot", 20);
serializer.serializer(user);
User result = serializer.deSerializer(null, null);
System.out.println(result);
}
public interface ISerializer {
<T> byte[] serializer(T obj);
<T> T deSerializer(byte[] data, Class<T> clazz);
}
public class JavaSerialier implements ISerializer {
@Override
public <T> byte[] serializer(T obj) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);
outputStream.writeObject(obj);
return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return new byte[0];
}
@Override
public <T> T deSerializer(byte[] data, Class<T> clazz) {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
try {
ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
return (T) inputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
public class FileSerializer implements ISerializer {
@Override
public <T> byte[] serializer(T obj) {
try {
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(new File("src/main/resources/user")));
outputStream.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
return new byte[0];
}
@Override
public <T> T deSerializer(byte[] data, Class<T> clazz) {
try {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File("src/main/resources/user")));
return (T) inputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
网友评论