对象流 ObjectInputStream ObjectOutputStream

【1】对象流 

ObjectOutputStream
ObjectInputStream 

用于存储和读取基本数据类型或对象的处理流

他的强大之处就是可以把java中的对象写入到数据流中,也能把对象从数据源中还原回来

 

【2】序列化和反序列化

ObjectOutputStream类:把内存中的java对象转换成平台无关的二进制数据,从而允许把这种二进制数据持久地保存在硬盘上,或通过

网络将这种二进制数据传输到另一个网络节点。----》序列化

用ObjectOutputStream类:当其它程序获取了这种二进制数据,就可以恢复成原来的java对象。---》反序列化

代码:

首先将一个字符串对象写到文件当中去:---》序列化

复制代码
package com.msb.io04;

import java.io.*;

/**
 * @author : liu
 * 日期:09:18:05
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Test01 {
    //这是一个main方法:是程序的入口
    public static void main(String[] args) throws IOException {
        //将内存中的字符串写出到文件中去:
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("d:\\test1.txt")));
        //将内存中的字符串写出到文件中:
        oos.writeObject("你好");
        //关闭流
        oos.close();
    }
}
复制代码

查看文件:

 

 我们看不懂文件的内容,但是程序是可以看懂的,所以可以写一个程序读文件中内容---》反序列化

复制代码
package com.msb.io04;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * @author : liu
 * 日期:09:22:41
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Test02 {
    //这是一个main方法:是程序的入口
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //将文件中保存的字符串读入到内存中来
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("d:\\test1.txt")));
        //Object o = ois.readObject();
        String s = (String) ois.readObject();//在这里我们知道读取的是一个String类型的对象流可以直接转换位String类型
        System.out.println(s);
        //关闭流
        System.out.println(ois);
    }
}
复制代码

控制台

 【4】代码:操作自定义类的对象

自定义的Person类

复制代码
package com.msb.io05;

/**
 * @author : liu
 * 日期:09:31:00
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Person {
    private String name;
    private int age;

    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;
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
复制代码

测试类

复制代码
package com.msb.io05;

import java.io.*;

/**
 * @author : liu
 * 日期:09:32:56
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Test01 {
    //这是一个main方法:是程序的入口
    public static void main(String[] args) throws IOException {
        //序列化:将内存中对象----》文件
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("d:\\test.txt")));
        //创建一个对象
        Person lili = new Person("lili", 19);
        oos.writeObject(lili);
        oos.close();
    }
}
复制代码

运行的时候发现异常

 

 

 出现异常的原因是:

你想要序列化的那个对象对应的类必须要实现要一个接口

 

 

 

接口内部,什么都没有,这种 接口叫标识接口。

起到表示作用,标识是什么呢?只要实现这个接口的类的对象才能序列化,否则不可以。

解决办法:将Person实现标识接口就可以

 

 

 测试:发现序列化成功,Person具备了序列化的能力

 

 

 这个二进制文件我们看不懂,但是程序能看懂,所以我们可以用程序实现  反序列化操作;

将这个对象恢复到内存中

复制代码
package com.msb.io05;

import java.io.*;

/**
 * @author : liu
 * 日期:09:53:06
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Test02 {
    //这是一个main方法:是程序的入口
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("d:\\test.txt")));
        Person p = (Person)ois.readObject();
        System.out.println(p);
        ois.close();
    }
}
复制代码

结果:

因为我们没有重写toString方法,所以结果位

 

 

证明了反序列化成功了:将二进制数据读入到内存中来

 

我现在在Person类中加入ToString方法

复制代码
package com.msb.io05;

import java.io.Serializable;

/**
 * @author : liu
 * 日期:09:31:00
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Person implements Serializable {
    private String name;
    private int age;

    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;
    }

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
复制代码

再次运行测试类:

出现异常:

 

 出现异常的原因:

解决:给这个类加入一个序列号:serialvEersionUID

 

 

 

 【6】idea中配置序列化设置  2021.3版本

 

 

  在Person类上:alt+enter

 

 

 

 

【7】序列化细节

(1)被序列化的类的内部所有属性,必须是可序列化的(基本数据类型都是可序列化的)

 

 

 

 

(2)static transient修饰的属性不可以被序列化

transient可以修饰一些用于被保护的数据像密码类的数据,这样就不会被反序列化得到

 

复制代码
package com.msb.io05;

import java.io.Serializable;

/**
 * @author : liu
 * 日期:09:31:00
 * 描述:IntelliJ IDEA
 * 版本:1.0
 */
public class Person implements Serializable {

    private static final long serialVersionUID = -474097987956658159L;
    private transient String name;
    private static int age;
    private Famaily f=new Famaily();

    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;
    }

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", f=" + f +",age="+age+
                '}';
    }
}
复制代码

结果

 

posted @   爱的加勒比  阅读(117)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示