对象流
对象的序列化机制
允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的java对象
优点
序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可以被还原
序列化是RMI(Remote Method Invoke-远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础,因此序列化机制是JavaEE平台的基础
如果需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
Serializable
Externalizable
package IO;
import java.beans.PersistenceDelegate;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.junit.Test;
public class TestObjectInputOutputStream {
// 对象的反序列化过程,将硬盘中文件通过ObjectInputStream转换为相应的对象
/*
* 要求: 1.此类是可序列化的:Serializable接口或者Externalizable接口
* 2.要求属性也要同样实现接口
* 3.凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
* private static final long serialVersionUID=45465445L;
* private static final long serialVersionUID
* 4.不能序列化static和transient修饰的变量和属性
*/
@Test
public void TestObjectInputOutputStream() {
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream("person.txt"));
Person p1 = (Person) objectInputStream.readObject();
Person p2 = (Person) objectInputStream.readObject();
System.out.println(p1 + "\n" + p2);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (objectInputStream != null) {
try {
objectInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 对象的序列化过程,将内存中的对象通过ObjectOutPutStream转换为二进制流,存储在硬盘文件中
@Test
public void testObjectOutputStream() {
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("person.txt")));
Person p1 = new Person("Hadi", 11,new Pet("dahua"));
Person p2 = new Person("Qiao", 24,new Pet("bigFlower"));
objectOutputStream.writeObject(p1);
objectOutputStream.flush();
objectOutputStream.writeObject(p2);
objectOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
// 要实现序列化的类java.io.NotSerializableException
// 实现接口
class Person implements Serializable {
private static final long serialVersionUID=45465445L;
String name;
Integer age;
Pet pet;
public Person(String name, Integer age, Pet pet) {
this.name = name;
this.age = age;
this.pet = pet;// new Pet("huahua")
}
@Override
public String toString() {
return "Person [name=" + name + ",age=" + age + "Pet" + pet + "]";
}
}
class Pet implements Serializable{
String name;
public Pet(String name) {
this.name = name;
}
public String toString(){
return"Pet [name="+name+"]";
}
}