对象序列化指的是将保存在内存中的对象转化为二进制数据的形式,这样就可以将对象保存在文件之中或者是进行网络传输。但是如果要想实现对象序列化的操作,有一个要求:对象所在的类一定要实现java.io.Serializable接口,此接口没有任何的方法,所以是一个标识接口。
范例:定义可以被序列化的对象
@SuppressWarnings("serial") class Person implements Serializable { // 此类对象可以被序列化 } |
如果在开发之中,用户只关心这个接口的实现,而具体如何实现序列化和反序列化可以暂时不理会,那么下面将通过代码演示序列化和反序列化的操作。
这两个操作要分别使用两个类完成:ObjectOutputStream、ObjectInputStream,来观察这两个类的继承结构和构造方法
对象序列化:ObjectOutputStream | 对象反序列化:ObjectInputStream |
java.lang.Object java.io.OutputStream java.io.ObjectOutputStream | java.lang.Object java.io.InputStream java.io.ObjectInputStream |
public ObjectOutputStream(OutputStream out) throws IOException | public ObjectInputStream(InputStream in) throws IOException |
public final void writeObject(Object obj) throws IOException | public final Object readObject() throws IOException, ClassNotFoundException |
范例:对象序列化
@SuppressWarnings("serial") class Person implements Serializable { // 此类对象可以被序列化 private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "姓名:" + this.name + ",年龄:" + this.age; } } |
public class TestDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "person.ser"); ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file)) ; output.writeObject(new Person("张三",20)); output.close(); } } |
范例:读取对象 —— 反序列化
public class TestDemo { public static void main(String[] args) throws Exception { File file = new File("D:" + File.separator + "person.ser"); ObjectInputStream input = new ObjectInputStream(new FileInputStream(file)) ; System.out.println(input.readObject()); input.close(); } } |
但是在默认情况下,一个对象之中的所有属性都被序列化了,如果现在希望某些属性不被序列化,则在属性声明时可以加上transient关键字。
private transient String name; |
对于序列化和反序列化日后会有机制帮助用户自动完成。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |