目录
1.ObjectlnputStream和OjbectOutputSteam
1.相关定义和内容
1.ObjectlnputStream和OjbectOutputSteam
1.用于存储和读取基本数据类型数据或对玺的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
2.序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
反序列化:用ObjectlnputStream类读取基本类型数据或对象的机制
3.ObjectOutputStream利lObjectlnputStream不能序列化static和ltransient修饰的成员变量,若有属性不想被序列化可标识为static和ltransient,但该属性会为默认值(null 和 0)
2.对象的序列化
1.对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象
2.序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原
3.序列化是 RMI (Remote Method lnvoke-远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是JavaEE平台的基础,如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:Serializable/ Externalizable。否则,会抛出NotSerializableException异常
2.对象流的使用
1.ObjectOutputStream
注意:写入生成的文件时不能看到(乱码)
@Test
public void TestObjectOutputStream() {
ObjectOutputStream oos = null;
try {
//1.创建对象
oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\zhang\\Desktop\\1.txt"));
//2.写入
oos.writeObject(new String("我是某某某"));
oos.flush();//刷新
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.ObjectInputStream
@Test
public void TestObjectInputStream() {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("C:\\Users\\zhang\\Desktop\\1.txt"));
Object obj = ois.readObject();
String str = (String) obj;
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.自定义对象实现序列化与反序列化
1.要求:
1. 需要实现 Serializable 接口(可序列化的标识接口)
2. 当前类需要定义一个全局常量 serialVersionUID(可设置自动生成,方法见以下博客IDEA使用笔记(八)——自动生成 serialVersionUID 的设置 - godtrue - 博客园)
serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版 本控制,有关各版本反序列化时是否兼容。如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID可能发生变化。故建议,显式声明 。
3. 保证其内部所有属性都是可序列化的(默认情况下,基本数据类型可序列化),即若其属性有自定义的类,则该类要实现Serializable接口。
2.使用
@Test
public void TestObjectOutputStream() {
ObjectOutputStream oos = null;
try {
//1.创建对象
oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\zhang\\Desktop\\1.txt"));
Person p = new Person("张三", 19);
//2.写入
oos.writeObject(p);
oos.flush();//刷新
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("C:\\Users\\zhang\\Desktop\\1.txt"));
Person p = (Person) ois.readObject();
System.out.println(p);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}