对象流objectOutputStream 及其实例

文章介绍了Java中的对象流,包括序列化和反序列化过程,以及如何使用ObjectOutputStream和ObjectInputStream进行操作。序列化是将对象转化为可存储或传输状态的过程,需要实现Serializable接口。静态属性和transient修饰的属性不会被序列化。文章还讨论了序列号的重要性和如何处理版本控制问题,以及提供了一个简单的序列化和反序列化的代码示例。
摘要由CSDN通过智能技术生成
Object流 | 对象流 | 引用数据类型流 : 保留数据类型(基本|引用)
    字节流的功能流

序列化 : 将对象转为可存储|可传输的状态的过程

序列化输出流  ObjectOutputStream
    新增功能 : void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
反序列化输入流 ObjectInputStream
    新增 功能 : Object readObject() 从ObjectInputStream中读取一个对象。

先序列化后反序列化
不是所有的类型的对象都能实现序列化   java.io.Serializable
不是所有的属性都需要序列化  transient
静态属性不会序列化
如果父类实现了序列化,子类没有实现,子类可以序列化所有内容
如果父类没有实现序列化,子类实现了序列化,子类只能序列化独有内容

序列号 :
    实现了序列化的类型都默认存在序列号,如果显示定义以定义的为主,没有显示的定义,会存在默认的
    如果使用的是默认提供的序列号,会跟随成员的改动而更新

通过序列号控制前后版本一致问题 : 默认在读取对象时候会先检查序列号,如果不一致直接抛出异常java.io.InvalidClassException,一致才能正常转换
如果想要实现就算类型的成员修改,序列号也要保持不变-->手动添加序列号
需要进行步骤 :
    1.实现Serializable接口
    2.在settings进行设置
    3.选中序列号类型类名->alt+enter->生成序列号字段
public class Class004_Object{
    public static void main(String[] args) throws Exception {
        writeToFile("D://xixi.txt");
        readFile("D://xixi.txt");
    }

    public static void writeToFile(String path) throws IOException {
        //1.构建流
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
        //2.准备数据
        Student s = new Student(101,"李四",18);
        int[] arr = {1,2,3,4,5};
        //3.写出
        os.writeObject(s);
        os.writeObject(arr);
        //4.刷出
        os.flush();
        //5.关闭
        os.close();

        Student.no = 100;
    }

    public static  void readFile(String path) throws Exception {
        //1.构建流
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(path));
        //2.读取
        Student s = (Student) is.readObject();
        int[] arr = (int[]) is.readObject();
        //3.使用
        System.out.println(s);
        System.out.println(Arrays.toString(arr));
        //4.关闭
        is .close();
    }
}

class Student implements Serializable {
    private static final long serialVersionUID = 7292531504929399778L;
    static int no;
    private String name;
    private transient int age;

    public Student() {

    }

    public Student(int no, String name, int age) {
        this.no = no;
        this.name = name;
        this.age = age;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值