对象序列化机制可以把内存中的java对象转换成平台无关的二进制,从而允许把这种二进制流持久的保存在磁盘上或者通过网络将这种二进制流传输到另一个网络节点。当其他的程序获取了这种二进制流就可以恢复成原来的java对象。
序列化的好处在于可将任何实现了Serializable接口的对象转化成字节数据,使其保存和传输时可被还原。
序列化是 RMI过程的参数和返回都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是Java平台的基础。
如果需要让某个对象支持序列化机制。则必须让其类实可序列化的,为了让某各类是可序列化的该类必须实现如下的两个接口之一: Serializable Externalizable
public class Test03 {
/**
*
* 对象的反序列化过程,将硬盘中的文件通过ObjectInputStream 转换成相应的对象
*/
@Test
public void test02() {
ObjectInputStream ois =null;
try {
ois = new ObjectInputStream(
new FileInputStream(new File("xiaomi.txt")));
Person p1 = (Person) ois.readObject();
System.out.println(p1);
Person p2 =(Person) ois.readObject();
System.out.println(p2);
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(ois!=null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* 对象的序列化过程,将内存中的对象通过ObjectOutputStream转换成
* 二进制流 ,存储在硬盘文件中
*/
@Test
public void test01() {
Person p1 = new Person("小米",23,new Pet("huahua",23));
Person p2 = new Person("红米",23,new Pet("zhangsan",21));
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(
new FileOutputStream(new File("xiaomi.txt")));
oos.writeObject(p1);
oos.flush();
oos.writeObject(p2);
oos.flush();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
*
* 要实现序列化的类,1.要求此类是可序列化的 实现Serializable 接口
* 2.要求类的属性也同样实现了Serializable接口
* 3.f凡是实现Serializable接口的类都有一个表示序列化版本的标识符的静态变量
* private static final long serialVersionUID;
* serialVersionUID 用来表明类的不同版本间的兼容性
* 如果类没有显示定义这个静态变量它的值是Jva运行环境根据类的内部细节自动生成,
* 若类的源代码作了修改,serialVersionUID可能会发生变化,故建议显示声明
* 显示定义serialVersionUID的用途
* 希望类的不同版本对序列化兼容,因此确保类的不同版本具有相同的serialVersionUID
* 不希望类的不同版本对序列化兼容,因此确保类的不同版本具有不同serialVersionUID
* 4.使用static或者transien修饰的属性 不可实现序列化
* @author Administrator
*
*/
class Person implements Serializable{
private static final long serialVersionUID=1237785445l; //作为一个版本号
String name;
Integer age;
Pet pet;
public Person(String name, Integer age, Pet pet) {
super();
this.name = name;
this.age = age;
this.pet = pet;
}
/*public Person(String name,Integer age) {
this.name = name;
this.age = age;
}*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
class Pet implements Serializable{
String name;
Integer age;
public Pet(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Pet [name=" + name + ", age=" + age + "]";
}
}