序列化

序列化流

  java提供了一种对象序列化的机制,用一个字节序列化表示一个对象,该字节序列

ObjectOutputStream类

  java.io.ObjectOutStream类,将Java对象的原始数据类型写入到文件中,实现对象的持久化存储。

构造方法

  • public ObjectOutputStream(OutputStream out) : 创建一个指定的OutputSrteam的ObjectOutputStream类对象

特有方法

  • void writeObject(Object obj) : 将指定的对象写入到对象序列化流中

使用步骤:

  1. 创建ObjectOutputStream流对象,构造方法中传递指定的字节输出流
  2. 使用ObjectOutputStream对象中方法writeObject,把对象写入到文件中。
  3. 释放资源。

注意:当某个对象需要进行序列化时,没有实现序列化接口时会抛出异常
解决:让该类实现Serializable接口,启用序列化功能。未实现接口的类将无法使其任何状态序列化或者进行反序列化(java.io.Serializable接口称之为标记接口)

序列化操作
一个对象想要能够实现序列化,必须满足两个条件:

  1. ​ 一个对象想要能够序列化和反序列化,必须满足两个条件:
  2. 该类必须实现java.io.Serializable接口,Serializable接口,是一个标记型接口,如果该类没有实现Serializable接口,将会抛出NotSerializableException。
  3. 该类的所有属性必须是可以实现序列化或者反序列化。如果有一个属性不想让它参与序列化,则该属性必须标明是瞬态的,瞬时的,这个关键字是transient

transient关键字:瞬态关键字
  被transient关键字修饰的成员变量,不参与对象序列化
  进行序列化时该属性没有值,系统会附一个默认值

static 关键字:静态关键字
  静态优先于非静态加载到内存当中(静态优先于对象进入到内存当中)
  被static修饰的成员变量不能被序列化,序列化的都是对象。

public class Student implements Serializable {
    private String name;
    private transient Integer age;// 不让age属性参与序列化
} 
ObjectInputStream类

java.io.ObjectInputStream类是反序列化流,将之前使用ObjectOutputStream序列化流的原始数据恢复为对象。

构造方法

  • public ObjectInputStream(InputStream in):创建一个指定的InputStream的对象反序列化流对象。

特有方法

  • public final Object readObject():从反序列化流中读取一个对象。

 对于JVM来说,能够进行反序列的对象 ,前提条件是必须能够找到class文件的类,如果找不到该类的class文件,则会抛出一个ClassNotFoundException异常。

 另外,当JVM序列化对象时,能够找到class文件,但是class文件在序列化对象时,发生了修改,那么反序列化操做会抛出一个InvalidClassException异常。原因如下:

  • 该类的序列化版本号与从流中读取出来描述该类的版本号不一致。
  • 该类包含了未知数据类型。
  • 该类没有可访问的无参构造方法。

 Serializable接口给需要序列化的类,提供了一个序列化版本号,serialVersionUID 该版本号的目的就是在于验证序列化的对象和对应的类是否是版本一致的。

// 序列化操作类
public class Demo01ObjectOutputStream {
    public static void main(String[] args) throws IOException {
        //1.创建ObjectOutputStream流对象,构造方法中传递指定的字节输出流。
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day30_IO\\student.txt"));
        //2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中。
        //2.1 先创建一个对象
        Student s = new Student("小孙", 30);
        s.score = 60;
        //2.2写对象到文件中
        oos.writeObject(s);
        //3.释放资源。
        oos.close();
    }
}
// 反序列化类操作
public class Demo02ObjectInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 1. 创建一个ObjectInputStream流对象,构造方法中传递一个字节输入流对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day30_IO\\student.txt"));
        // 2. 使用ObjectInputStream流对象中的方法readObject,读取保存在文件中的对象数据
        Object obj = ois.readObject();
        // 3.释放资源。
        ois.close();
        // 4. 查看对象的数据
        System.out.println(obj);// Student{name='小孙', age=30}
        if ( obj instanceof Student) {
            Student student = (Student)obj;
            System.out.println(student.getAge() + "--" + student.getName());
        } else {
            System.out.println("转换失败");
        }
    }
}
// 需要被序列化的类
import java.io.Serializable;
public class Student implements Serializable {
    // 可以选择手动自定义一个序列化版本号
    private static final long serialVersionUID = 1L;
    //private static String name;
    private String name;
    private Integer age;
    private transient String address = "郑州市";
    transient int score;// 0
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值