【Java】第四十节 IO流之对象流

对象序列化机制:

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

对象序列化的条件:

1、实现Serializable;
2、定义全局常量private static final long serialVersionUID;
3、除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性也都是可序列化的;(默认情况下,基本数据类型可序列化)
4、类中定义的用static和transient修饰的变量不能被序列化。

serialVersionUID的作用:

Java的序列化机制是通过在运行时判断字节流中的 serialVersionUID与本地相应实体类的serialVersionUID来验证该类版本的一致性的;
如果没有显示定义serialVersionUID,则程序会自动生成一个serialVersionUID,序列化后到反序列化前期间如果对类做了修改,那么会导致本地相应的实体类的serialVersionUID发生变化,从而与字节流中的 serialVersionUID不相同;
在进行反序列化时,JVM会把传来的字节流中的 serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)

对象流:ObjectInputStream和OjbectOutputSteam

用于存储和读取基本数据类型数据或对象的处理流,它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

  • 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制;
  • 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制;
  • ObjectOutputStream和ObjectInputStream同样不能序列化static和transient修饰的成员变量。
例:

将下面的实体类用对象流实现序列化与反序列化:

class Person implements Serializable{

    private static final long serialVersionUID = 1231242L;
    private String name;
    private int age;
    private String gender;

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

    //此处省略get/set方法

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

ObjectOutputStream测试类:

package cn.jingpengchong.io;

import java.io.*;

public class ObjectStreamTest {
    public static void main(String[] args) {
        testObjectOutputStream();
    }

    private static void testObjectOutputStream() {

        ObjectOutputStream output = null;
        try {
            output = new ObjectOutputStream(new FileOutputStream("object.dat"));
            output.writeObject(new Person("孙悟空",520,"男"));
            //将缓存区的数据刷新到输出流中
            output.flush();
            System.out.println("操作成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(output != null){
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果如下:
在这里插入图片描述
ObjectInputStream测试类:

package cn.jingpengchong.io;

import java.io.*;

public class ObjectStreamTest {
    public static void main(String[] args) {
        testObjectInputStream();
    }

    private static void testObjectInputStream() {
        ObjectInputStream input = null;
        try {
            input = new ObjectInputStream(new FileInputStream("object.dat"));
            Person per = (Person)input.readObject();
            System.out.println(per);
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if(input != null){
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果如下:
在这里插入图片描述

发布了128 篇原创文章 · 获赞 17 · 访问量 2740

猜你喜欢

转载自blog.csdn.net/qq_43705275/article/details/103995509