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會拋出序列化版本不一致的異常
如果您覺得有幫助,歡迎點贊哦 ~ 謝謝!!