1、对象流理解
- ObjectInputStream 和 ObjectOutPutStream
- 用于存储和读取基本数据类型数据或对象的处理流。强大:可以把java中的对象写入到数据源中,也能把数据从对象源中还原回来。
- 序列化:用 ObjectInputStream 类保存基本数据类型或对象的机制
- 反序列化:用ObjectOutPutStream 类读取基本数据类型或对象的机制
- ObjectInputStream 和 ObjectOutPutStream 不能序列化 static 和 transient 修饰的成员变量。
2、对象的序列化
简单理解:允许把内存中java对象转化成与平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或通过网络将二进制流传输到另一个网络节点。当其他程序获取了这种二级制流,就可以恢复原来的java 对象。
序列化的好处在于可将任何实现了Serializable 接口的对象转化为字节数据,使其在保存和传输时可被还原。
序列化是RMI(Remote Method Invoke - 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI 是java EE 的基础。序列化机制是java 平台的基础。
如果需要让某个对象支持序列化机制,必须让该对象所属类及其属性是可序列化的,为了让某个类是可序列化的,则该类必须实现以下两个接口之一,否则会抛异常。
- Serializable
- Externalizable
3、代码实现序列化与反序列化
package test;
import org.junit.Test;
import java.io.*;
public class TestObjectStream {
/**
* 序列化过程
*/
@Test
public void test1(){
ObjectOutputStream objectOutputStream = null;
try {
//1、造文件
objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.dat"));
//2、流
objectOutputStream.writeObject(new String(" 我 爱 工 作"));
objectOutputStream.flush();//刷新操作
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
//3、关闭流
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 反序列化过程
*/
@Test
public void test2(){
ObjectInputStream objectInputStream = null;
try {
//1、造文件
//流
objectInputStream = new ObjectInputStream(new FileInputStream("object.dat"));
Object obj = objectInputStream.readObject();
String str = (String) obj;
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (objectInputStream != null) {
try {
//关闭流资源
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
结果: