标签:name tco col ble 实现 close dex ber oid
Java序列化
Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列, 该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含序列化和反序列化对象的方法。
什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
序列化ID
序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。
注意:
该类必须实现 java.io.Serializable 对象。
该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。
总结:
a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
c) static,transient后的变量不能被序列化;
实例展示:
public class SerializationTest {
public static void main(String[] args) {
Employee employee = new Employee("Brook", "Shenyang", 99, 100506);
final String filePath = "/tmp/employee.ser";
//序列化
try {
FileOutputStream outputStream = new FileOutputStream(filePath);
ObjectOutputStream objStream = new ObjectOutputStream(outputStream);
objStream.writeObject(employee);
objStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
//反序列化
Employee readEmp = null;
try {
FileInputStream input = new FileInputStream(filePath);
ObjectInputStream objIn = new ObjectInputStream(input);
readEmp = (Employee)objIn.readObject();
input.close();
objIn.close();
} catch (IOException e) {
e.printStackTrace();
return;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
System.out.println("名字: " + readEmp.getName());
System.out.println("编号: " + readEmp.getNumber());
System.out.println("邮编: " + readEmp.postcode());
}
}
//输出结果:
名字: Brook
编号: 99
邮编: 0
标签:name tco col ble 实现 close dex ber oid
原文地址:http://www.cnblogs.com/brook0366/p/7641370.html