序列化
Java 有一种机制将对象表示为一个字节序列在存储在文件中,这种机制就叫做序列化。
当然也会有反序列化恢复在文件中的对象。
序列化
被序列化的类需要实现Serializable
接口,但却不需要重写任何方法。
import java.io.Serializable;
public class Book implements Serializable {
String name;
public Book(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
'}';
}
}
创建一个Book
类的对象并存储在文件中
public class Main {
public static void main(String[] args) {
Book book = new Book("哈哈");
File file = new File("/javaidea/imgs/testObject.txt");
ObjectOutputStream oos = null;
try {
if (!file.exists()){
file.createNewFile();
}
}catch (IOException e) {
e.printStackTrace();
}
try {
oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(book);
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (null != oos){
oos.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
反序列化
public class Main {
public static void main(String[] args) {
File file = new File("/javaidea/imgs/testObject.txt");
Book book1 = null;
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
book1 = (Book) ois.readObject();
}catch (IOException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
try {
if (null != ois){
ois.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
System.out.println(book1.toString());
}
}
结果:
Book{name='哈哈'}
serialVersionUID
每一个实现Serializable
的类都会有一个serialVersionUID
值,绝大多数都不会改变,但是当你之后该变其中的属性个数或种类时,serialVersionUID
值也会改变。
而想要反序列化的对象的serialVersionUID
值与当前情况下类的serialVersionUID
不同时,反序列化就会失败。所以推荐是自定义serialVersionUID
值。
比如将上面的Book类改成这样:
import java.io.Serializable;
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
String name;
String auther;
public Book(String name, String auther) {
this.name = name;
this.auther = auther;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", auther='" + auther + '\'' +
'}';
}
}
再反序列化:结果为:
Book{name='哈哈', auther='null'}
可以看到之前有的属性照常读入,之后添加的属性为默认值。