Java 对象 序列化/反序列化 Serializable和 Externalizable 基本用法
概念
- 所谓序列化是把 Java对象转换成字节流保存到本地文件
- 反序列化是指从磁盘读取相关字节流转换成 Java对象的过程
主要功能场景
- 持久化到磁盘, 存到数据库等
- 为了网络中传输对象
- 为了进程之间传递对象
Serializable序列化
类实现 Serializable
- Java类只要实现了 java.io.Serializable接口就可以序列化相关对象
public class User implements Serializable {
private static final long serialVersionUID = -5142052165948444605L;
private Integer age;
private String name;
public User() {}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
对象 序列化/反序列化
- ObjectInputStream 从字节流中读取对象
- ObjectOutputStream 对象转换字节流写入
public class App {
public static void main(String[] args) {
final User user = new User();
user.setAge(30);
user.setName("Shawn Jeon");
try {
File file = new File("D:" + File.separator + "User");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
/** 对象写入到文件*/
oos.writeObject(user);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
/** 从磁盘读取对象*/
User user2 = (User) ois.readObject();
System.out.println(user2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
# 输出 User{age=30, name='Shawn Jeon'}
Externalizable序列化
类实现 Externalizable
- Java类只要实现了 java.io.Externalizable接口后 @Override相关方法来实现序列化
public class Person implements Externalizable {
private static final long serialVersionUID = 7274549675763175797L;
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(age);
out.writeObject(name);
}
@Override
public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {
this.age = (Integer) oi.readObject();
this.name = (String) oi.readObject();
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
对象 序列化/反序列化
public class PersonApp {
public static void main(String[] args) {
final Person person = new Person();
person.setAge(30);
person.setName("Shawn Jeon");
try {
File file = new File("D:" + File.separator + "Person");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
/** 对象写入到文件*/
oos.writeObject(person);
ObjectInputStream ois= new ObjectInputStream(new FileInputStream(file));
/** 从磁盘读取对象*/
Person person2 = (Person) ois.readObject();
System.out.println(person2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
# 输出 Person{age=30, name='Shawn Jeon'}
transient关键字
- 对象序列化时可以指定忽略属性
private transient String name;
序列化ID serialVersionUID
- serialVersionUID是指定相关序列化对象版本的, 如果序列化后改动此版本 Java JVM会抛出序列化版本不一致的异常
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!