序列化
1.基本概念
序列化是指:将内存中保存的对象变为二进制数据流的形式进行传输,或者是将其保存在文本中。
java中只要实现了Serializable
接口,就具备了序列化的能力。Serializable
接口称为‘标记接口’,
这个接口内部没有定义任何内容,所以只是起标记的作用,让JVM知道哪些类需要被序列化。
代码示例,定义一个可以被序列化的类;
import java.io.Serializable;
/**
* @Name:定义一个可以被序列化的类
* @Author:ZYJ
* @Date:2019-05-27-17:24
* @Description:
*/
public class SerializableTest {
class Person implements Serializable{
private String name;
private int age;
Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String toString(){
return "Person [name="+name+",age="+age+"]";
}
}
}
序列化对象时所需要保存的就是对象中的属性,所以默认情况下对象扽属性将会被转为二进制数据流存在。
2. 序列化与反序列化
具体是否需要将对象序列化用到以下两个类
2.1,ObjectOutputStream
1.定义
public class ObjectOutputStream extends OutputStream implements ObjectOutput,ObjectStreamConstants
2.构造方法:指定要输出的端
public ObjectOutputStream(OutputStream out)throws IOException
3.方法:将指定对象转换为二进制流。
public final void writeObject(Object obj)throws IOException
2.2 , ObjectInputStream
1.定义
public class ObjectInputStream extends InputStream implements ObjectInput,ObjectStreamConstans
2.构造方法:
public ObjectInputStream(InputStream in)throws IOException
3.方法:根据指定的输入端将对象反序列化
public final Object readObject()
2.3,代码示例:实现文件对象序列化与反序列化
import java.io.*;
/**
* @Name:实现对象序列化与反序列化
* @Author:ZYJ
* @Date:2019-05-27-17:24
* @Description:
*/
public class SerializableTest {
public static final File FILE = new File("C:\\Users\\ZYJ\\Desktop" +
"\\javaIO\\ioTest\\hello.txt");
public static void main(String[] args) throws IOException, ClassNotFoundException {
ser(new Person("Amanda",21));
der();
}
/**
* 给文件写入内容并转为二进制流
* @param obj
* @throws IOException
*/
public static void ser(Object obj) throws IOException {
//实例化对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE));
//将二进制流写入文件
oos.writeObject(obj);
//关闭流
oos.close();
}
/**
* 将二进制文件内容 反序列化后输入在终端
* @param
* @throws IOException
* @throws ClassNotFoundException
*/
public static void der() throws IOException, ClassNotFoundException {
//获取终端文件
ObjectInputStream ois= new ObjectInputStream(new FileInputStream(FILE));
//
System.out.println(ois.readObject());
ois.close();
}
}
class Person implements Serializable{
private String name;
private int age;
Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String toString(){
return "Person [name="+name+",age="+age+"]";
}
}
3.transient
关键字
实现了serializable
接口的类会默认将所有属性进行序列化。若某些属性值不想被序列化保存,就是用transient
关键字修饰此属性即可。