文章目录
对象的序列化机制(重点)
序列化:允许把内存中的Java对象转换成平台无关的
二进制流
,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另外地的网络节点
反序列化:当其他程序读取了这种二进制流,就可以恢复成原来的java对象
1.1 序列化 ObjectOutputStream保存基本数据类型或对象
/*
序列化过程:将内存中的Java对象保存到磁盘中或通过网络传输出去
使用ObjectOutputStream
*/
@Test
public void testObjectOutputStream(){
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("hello.data"));
oos.writeObject(new String("序列化测试"));
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.1 反序列化 ObjectInputStream读取基本数据类型或对象
/*
反序列化过程:将
使用ObjectInputStream
*/
@Test
public void testObjectInputStream(){
ObjectInputStream ois = null;
try {
ois = null;
ois = new ObjectInputStream(new FileInputStream("hello.data"));
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();
}
}
}
1.3 自定义可序列化的类
要想一个Java对象是可序列化的需要满足
- 实现标识接口
Serializable
(标识接口指,接口内没有任何需要实现的方法的接口),一旦一个类实现了Serializable接口,就说明它是可序列化的 - 需要当前类提供一个全局常量serialVersionUID :格式:
public static final long serialVersionUID = 425684656556L;
- 处理当前类需要实现Serializable接口外,还必须保证其内部的所有属性也必须时可序列化的
默认情况下,所有的基本数据类型都是可序列化的
如果当前内存在一个属性是其他类的对象,则该对象所属的类也应该是可序列化的 - 补充、ObjectOutputStream和 ObjetcInputStream不能序列化static 和 transient修饰的成员变量。
1.3.1例:自定义可实例化的Person类
/* Person对象可序列化,要满足的要求
* 1、实现 Serializable 标识接口
* 2、需要当前类提供一个全局常量serialVersionUID
*
*/
public class Person implements Serializable {
public static final long serialVersionUID = 425684656556L;
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Person(){}
Person(int age,String name){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
1.3.2 对 serialVersionUID 的进一步理解
serialVersionUID
:用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关个版本反序列化时是否兼容- 如果没有显示地定义这个静态常量,他的值是Java运行时环境根据类的内部细节自动生成的。==若类的实例变量做了修改,serialVersionUID可能发生变化。==故建议,显示声明。