java-IO流对象流及其序列化介绍

2022-07-28 11:26:24

目录

1对象流

2序列化和反序列化

2.1序列化ObjectOutputStream

2.1.1声明形式

2.1.2构造函数

2.1.3特有方法

2.2反序列化ObjectInputStream

2.2.1声明形式

2.2.2构造函数

2.2.3特有方法

2.3特点

2.3序列化和反序列化过程

2.3.1Person类

2.3.2序列化过程

2.3.3反序列化过程

2.3.4结果

3版本号serialVersionUID


1对象流

可以操作对象的类,是一个对象在文件中的读取或者写入。

2序列化和反序列化

2.1序列化ObjectOutputStream

将对象实例保存到磁盘的过程

2.1.1声明形式

public class ObjectOutputStream
    extends OutputStream implements ObjectOutput, ObjectStreamConstants;

2.1.2构造函数

 public ObjectOutputStream(OutputStream out) throws IOException;//需要传入一个字节输出流

2.1.3特有方法

public final void writeObject(Object obj) throws IOException ;
//写入一个对象

2.2反序列化ObjectInputStream

将对象从磁盘中读取出来的过程

2.2.1声明形式

public class ObjectInputStream
    extends InputStream implements ObjectInput, ObjectStreamConstants

2.2.2构造函数

public ObjectInputStream(InputStream in) throws IOException;//需要传入一个字节输入流

2.2.3特有方法

public final Object readObject()
        throws IOException, ClassNotFoundException;//写入一个对象

2.3特点

(1)对象要能完成序列化和反序列化的对象必须实现Serializable接口

(2)序列化和反序列化需要使用到IO类ObjectInputStream和ObjectOutputStream

(3)虚拟机是否能支持序列化,也需要取决于serialVersionUID值

(4)transient关键字是来控制变量的序列化,在变量前加关键,当前的变量不参与序列化,反序列化中 transient关键字修饰的变量会给定初始值,存储对象时这个变量的值将不会改变。

 private  transient int age;

如:int类型存储变量值为0,对象类型存储null值

2.3序列化和反序列化过程

2.3.1Person类

import java.io.Serializable;

public class Person implements Serializable {  //实现Serializable 接口
     private String name;
     private  transient int age;
     private  int id;


    public String getName() {
        return name;
    }


    public int getAge() {
        return age;
    }

    public int getId() {
        return id;
    }

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

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

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "{姓名:"+getName()+" 年龄:"+getAge()+" 学号:"+getId()+"}";
    }
}

2.3.2序列化过程

        //主方法里

        Person person = new Person();    //先new一个对象
        person.setName("张三");
        person.setAge(20);
        person.setId(1906);

        ObjectOutputStream outputStream = null;
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\ccc\\Desktop\\IO流\\b.txt");
            outputStream = new ObjectOutputStream(fileOutputStream);
            outputStream.writeObject(person);  //写入person对象
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (outputStream != null) {
                try {
                    outputStream.close();   //关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

2.3.3反序列化过程

    //主方法里
  
    ObjectInputStream inputStream = null;
        try {
            inputStream = new ObjectInputStream(new             
            FileInputStream("C:\\Users\\ccc\\Desktop\\IO流\\b.txt"));
            Person o = (Person)inputStream.readObject();   //从文件中读取对象
            System.out.println(o);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){
                try {
                    inputStream.close();    //关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

2.3.4结果

new的person对象是:张三,20,1906

但是因为private  transient int age; 不管对象给定的age值是多少,存储进去的都会是0

3版本号serialVersionUID

如果将对象写入磁盘之后,想要添加或者修改变量,就会出现代码中的内容与磁盘存储内容不一致的情况,这该如何解决呢?

serialVersionUID的作用是进行版本控制,当对类添加或者修改类中的任何字段,已经序列化的对象将无法恢复,因为类已经生成新的serialVersionUID,在进行反序列化时,会将当前类的serialVersionUID和序列化的对象的serialVersionUID进行比较,如果不匹配,将抛出异常。

  • 作者:风一吹你就要走
  • 原文链接:https://blog.csdn.net/xkyjwcc/article/details/117278742
    更新时间:2022-07-28 11:26:24