对象流(序列化机制)

ObjectInputStream和ObjectOutputStream

1.用于存储和读取基本数据类型数据或对象的处理流,它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来
2.序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
3.ObjectInputStream和ObjectOutputStream不能序列化statictransient修饰的成员变量
4.[面试题]对象序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其他程序获取了这种二进制流,就可以恢复成原来的Java对象
5.如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一(Serializable:标识接口,Externalizable)。否则,会抛出NotSerializableException异常
5.类序列化需要满足的要求
(1)实现Serializable接口
(2)当前类提供全局常量serialVersionUID(对类的唯一标识),如果类没有显式定义这个常量,它的值是Java运行时环境根据类的内部细节自动生成的,若序列化后,对类的实例变量做了修改,serialVersionUID可能发生变化,还原java对象就会出问题了。所以还是建议显式声明。
(3)保证所有类的所有属性是可实例化的,类的实例变量如果为自定义类,该自定义类也必须实现Serializable接口
(4)static和transient修饰的变量不能序列化

序列化、反序列化自定义Person类

public class Demo implements Serializable {
    
    
    public static void main(String[] args) {
    
    

        ObjectOutputStream oos = null;
        ObjectInputStream  ois = null;
        try {
    
    
            //序列化:内存中的java对象保存到磁盘中或通过网络传输出去
            oos = new ObjectOutputStream(new FileOutputStream("object.data"));
            oos.writeObject(new Person("AA",22));
            oos.flush();//刷新操作
            //反序列化:将磁盘文件中的对象还原成内存中的一个java对象
            ois = new ObjectInputStream(new FileInputStream("object.data"));
            Person person = (Person) ois.readObject();
            System.out.println(person); //Person{name='AA', age=22}
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if(oos!=null){
    
    
                try {
    
    
                    oos.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

//标记Person类可序列化
class Person implements Serializable{
    
    

    public static final long serialVersionUID=20391L;

    private String name;
    private Integer age;

    public String getName() {
    
    
        return name;
    }

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

    public Integer getAge() {
    
    
        return age;
    }

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

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

    public Person() {
    
    
    }

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

}

おすすめ

転載: blog.csdn.net/a347635191/article/details/97108818