序列化流

序列化流

  • 序列化流:可以把Java中的对象写道本地文件当中(并不是原文,而是加密的不容易改变的
构造方法:
public ObjectOutputStream(OutputStream out)  把基本流写成高级流
成员方法:
piblic final void writeObject(Object obj)  把对象序列化(写出)到文件中去
package io流;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class xuliehua {
    public static void main(String[] args) throws IOException {


        /*
        需求:
        利用序列化/对象操作输出,把一个对象写道本地文件中
        构造方法:
        public ObjectOutputStream(OutputStream out)  把基本流写成高级流
        成员方法:
        piblic final void writeObject(Object obj)  把对象序列化(写出)到文件中去
         */

        //1.创建对象
        Student stu = new Student("zhangsan",23);

        //2.创建序列化流的对象/对象输出操作流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\code\\练习文件\\xuliehua.txt"));

        //3.写出数据
        oos.writeObject(stu);

        //4.释放资源
        oos.close();


    }
}

  • 小细节:使用输出流将对象保存到文件时会出现NotSerializableRxceptions异常

  • 解决方案需要让Javabean类实现Serializable接口

  • package io流;
    
    import java.io.Serializable;
    /*
    *
    * Serializable接口里没有抽象方法,标记型接口
    * 一旦实现了这个接口,那么就表示当前Student类可以被序列化
    *
    *
     */
    
    public class Student implements Serializable {
        private static final long serialVersionUID = 123456L;
    
    
            private String name;
        private  int age;
    
        public Student(){}
    
    
        public Student(String name,int age) {
            this.name=name;
            this.age = age;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    

反序列化

  • 对象操作输入流:可以把序列化到本地文件中的对象,读到程序中来

  • 
    
    package io流;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    
    public class fanxuliehua {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            /**
             * 需求:利用反序列化、对象操作输入流,把文件中中的对象读到程序当中
             * 构造方法:public ObjectInputStream(InputStream out  把基本流变成高级流
             * 成员方法:public Object readObject()   把序列化到本地文件中的对象,读取到程序中来
             *
             */
    
            //1.创建反序列化对象
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\code\\练习文件\\xuliehua.txt"));
    
            //2.读取数据
           Student o = (Student) ois.readObject();
    
            //3.打印对象
            System.out.println(o);
    
            //4.释放资源
            ois.close();
    
        }
    }
    

兼容问题

  • 使用序列化流将对象写到文件时,需要让Javabean类实现Serializale接口,标记型接口,否则会出现上文所说异常

  • 序列化流写到文件中的数据时不能修改的,一旦修改就无法再次读回来了

  • 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题

    答:会出问题,会抛出InvalidClassException异常

  • 遇到Java反序列化InvalidClassException的通用解决方法如下

    步骤 操作内容 说明
    显式声明serialVersionUID 在实现Serializable的类中,添加固定的serialVersionUID(如private static final long serialVersionUID = 1L;),确保序列化和反序列化时类版本标识一致。 ,确保序列化和反序列化时类版本标识一致。
    保持类结构一致 序列化和反序列化阶段,Serializable类的属性、方法、继承关系等结构需若类结构有修改,需重新生成序列化文件后再进行反序列化 若类结构有修改,需重新生成序列化文件后再进行反序列化
    重新生成序列化文件 若类结构或serialVersionUID发生变更,删除旧的序列化文件,重新执行序列化代码生成新文件,再进行反序列化操作。

    例如:

    public class Student implements Serializable {
        private static final long serialVersionUID = 1L; // 自定义一个固定值
        // 类的其他属性和方法
    }
    
posted @ 2025-11-01 13:39  RIcard  阅读(6)  评论(0)    收藏  举报