Java知识回顾 (13)序列化

本资料来自于runoob,略有修改。html

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象能够在另外一个彻底不一样的平台上反序列化该对象。java

类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。url

 

DEMOspa

示例对象类Employee.java.net

public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } }

一个类的对象要想序列化成功,必须知足两个条件:code

该类必须实现 java.io.Serializable 接口。htm

该类的全部属性必须是可序列化的。若是有一个属性不是可序列化的,则该属性必须注明是短暂的。对象

 

序列化对象blog

import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); }catch(IOException i) { i.printStackTrace(); } } }

反序列化对象接口

import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } }

以上程序编译运行结果以下所示:

Deserialized Employee... Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101

 

这里要注意如下要点:

readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。

对于 JVM 能够反序列化对象,它必须是可以找到字节码的类。若是JVM在反序列化对象的过程当中找不到该类,则抛出一个 ClassNotFoundException 异常。

注意,readObject() 方法的返回值被转化成 Employee 引用。

当对象被序列化时,属性 SSN 的值为 111222333,可是由于该属性是短暂的,该值没有被发送到输出流。因此反序列化后 Employee 对象的 SSN 属性为 0。

相关文章
相关标签/搜索