注意
:
文末有最新
Java实战
项目
和
面试题
遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题
-
-
作用。为啥要实现这个 Serializable 接口,也就是为啥要序列化
-
serialVersionUID 这个的值到底是在怎么设置的,有什么用。有的是1L,有的是一长串数字,迷惑ing。
我刚刚见到这个关键字 Serializable 的时候,就有如上的这么些问题。
在处理这个问题之前,你要先知道一个问题,这个比较重要。这个Serializable接口,以及相关的东西,全部都在 Java io 里面的。
一、序列化和反序列化的概念
-
序列化:把对象转换为字节序列的过程称为对象的序列化。
-
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
上面是专业的解释,现在来点通俗的解释。在代码运行的时候,我们可以看到很多的对象(debug过的都造吧),可以是一个,也可以是一类对象的集合,很多的对象数据,这些数据中,有些信息我们想让他持久的保存起来,那么这个序列化。
就是把内存里面的这些对象给变成一连串的字节描述的过程。
常见的就是变成文件
我不序列化也可以保存文件啥的呀,有什么影响呢?我也是这么问的。
二、什么情况下需要序列化
-
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
-
-
(老实说,上面的几种,我可能就用过个存数据库的)
三、如何实现序列化
实现Serializable接口即可
上面这些理论都比较简单,下面实际代码看看这个序列化到底能干啥,以及会产生的bug问题。
先上对象代码,FlyPig.java
package com.test;
import java.io.Serializable;
public class FlyPig implements Serializable {
// private static final long serialVersionUID = 1L;
private static String AGE = "269";
private String name;
private String color;
transient private String car;
private String addTip;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
public String getAddTip() {
return addTip;
}
public void setAddTip(String addTip) {
this.addTip = addTip;
}
@Override
public String toString() {
return "FlyPig{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
", car='" + car + '\'' +
", AGE='" + AGE+ '\'' +
'}';
}
}
注意下,注释的代码,是一会儿要各种情况下使用的。
下面就是main方法啦
package com.test;
import java.io.*;
public class SerializableTest {
public static void main(String[] args) throws Exception {
serializeFlyPig();
FlyPig flyPig = deserializeFlyPig();
System.out.println(flyPig.toString());
}
/**
* 序列化
*/
private static void serializeFlyPig() throws Exception {
FlyPig flyPig = new FlyPig();
flyPig.setColor("black");
flyPig.setName("riemann");
flyPig.setName("audi");
// ObjectOutputStream 对象输出流,将 flyPig 对象存储到E盘的 flyPig.txt 文件中,完成对 flyPig 对象的序列化操作
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/flypig.txt")));
oos.writeObject(flyPig);
System.out.println("FlyPig 对象序列化成功!");
oos.close();
}
/**
* 反序列化
*/
private static FlyPig deserializeFlyPig() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/flypig.txt")));
FlyPig pig = (FlyPig) ois.readObject();
System.out.println("FlyPig 对象反序列化成功!");
return pig;
}
}
对上面的2个操作文件流的类的简单说明
ObjectOutputStream代表对象输出流:
它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
ObjectInputStream代表对象输入流:
它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
具体怎么看运行情况。
第一种:上来就这些代码,不动,直接run,看效果。
实际运行结果,他会在 d:/flyPig.txt 生成个文件。
FlyPig 对象序列化成功!
FlyPig 对象反序列化成功!
FlyPig{name='audi', color='black', car='null', AGE='269'