Java-对象的序列化和反序列化

来源:互联网 发布:linux强制退出vi 编辑:程序博客网 时间:2024/06/01 21:37

/*
 * 对象的序列化和对象的反序列化:
 *1、 对象的序列化:把对象以流的方式写入到文件中保存
 *2、 对象的反序列化:把文件中保存的对象,以流的方式读取出来

 */



    /*
     * 对象的反序列化:把文件中保存的对象,以流的方式读取出来
     * java.io.ObjectInputStream类 继承InputStream
     *
     * 构造方法:
     *     ObjectInputStream(InputStream in) 构造方法中需要传入字节输入流的子类对象
     *
     * 成员方法:
     *     Object readObject() 从 ObjectInputStream 读取对象。     
     *
     * 操作流程:
     *     1.创建FileInputStream对象,并且绑定数据源
     *     2.创建ObjectInputStream对象,构造方法中传入FileInputStream对象
     *     3.调用ObjectInputStream中读取对象的方法,重文件中读取对象
     *     4.释放资源
     *     5.打印对象
     *
     * 注意:反序列化的前提必须有对象的.class文件,如果没有则抛出ClassNotFoundException
     */
    private static void readObject() throws IOException, ClassNotFoundException {
        //1.创建FileInputStream对象,并且绑定数据源
        FileInputStream fis = new FileInputStream("person.txt");
        //2.创建ObjectInputStream对象,构造方法中传入FileInputStream对象
        ObjectInputStream ois = new ObjectInputStream(fis);
        //3.调用ObjectInputStream中读取对象的方法,重文件中读取对象
        Object obj = ois.readObject();
        ois.close();
        //5.打印对象
        System.out.println(obj);
    }

    /*
     * 对象的序列化:把对象以流的方式写入到文件中保存
     * java.io.ObjectOutputStream类 继承 OutputStream
     *
     * 构造方法:
     *     ObjectOutputStream(OutputStream out) 构造方法中需要传入字节输出流的子类对象
     *
     * 成员方法:
     *     void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
     *
     * 操作流程:
     *     1.创建FileOutputStream对象,绑定数据目的地
     *     2.创建ObjectOutputStream对象,构造方法中传入FileOutputStream
     *     3.创建Person对象,并赋值
     *     4.调用ObjectOutputStream对象中写对象的方法,把对象写入到文件中
     *     5.释放资源
     *
     */
    private static void writeObject() throws IOException {
        //1.创建FileOutputStream对象,绑定数据目的地
        FileOutputStream fos = new FileOutputStream("person.txt");
        //2.创建ObjectOutputStream对象,构造方法中传入FileOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        //3.创建Person对象,并赋值
        Person p = new Person("张三", 20);
        //4.调用ObjectOutputStream对象中写对象的方法,把对象写入到文件中
        oos.writeObject(p);
        //5.释放资源
        oos.close();
    }


对象Person

/*
 * 类创建的对象想要实现序列化和反序列化,必须实现接口Serializable
 * Serializable接口中没有抽象方法,也无需重写
 * 不包含抽象方法的接口称之为标记型接口,作用就是起到标记作用
 * 意义:做序列化和反序列化的时候,JVM会检测,该类实现了Serializable接口不会抛异常
 *            做序列化和反序列化的时候,JVM会检测,该类没有实现了Serializable接口会抛出异常NotSerializableException
 *
 * java.lang 接口 Cloneable-->标记型接口
 * 如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。
 *
 *
 * 静态的成员变量属于类,不属于对象,序列化的是对象和静态没关系,所以静态的属性不能序列化
 * 保存的age是0,因为0是整数的默认值
 *
 * 瞬态关键字:transient
 * 作用:阻止成员变量序列化,只能用来修饰成员变量
 *
 * 自定义序列号,不管类是否发生修改,序列号都不会改变
 */
public class Person implements Serializable {

    // 自定义序列号,不管类是否发生修改,序列号都不会改变
    private static final long serialVersionUID = 12345L;

    private String name;
    // private /*static*/ int age;
    public/* transient */int age;


    。。。





}

0 0
原创粉丝点击