A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dadai5ai 中级黑马   /  2015-7-30 11:13  /  235 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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;

        对于序列化和反序列化日后会有机制帮助用户自动完成。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马