黑马程序员技术交流社区

标题: 对象序列化小结 [打印本页]

作者: dadai5ai    时间: 2015-7-30 11:13
标题: 对象序列化小结
本帖最后由 dadai5ai 于 2015-7-30 11:15 编辑

对象序列化指的是将保存在内存中的对象转化为二进制数据的形式,这样就可以将对象保存在文件之中或者是进行网络传输。但是如果要想实现对象序列化的操作,有一个要求:对象所在的类一定要实现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