ObjectInputStream || ObjectOutputStream 序列化对象输入输出流Demo 学习

A:Api 说明:

ObjectOutputStream 写入的基本数据和对象 *(内存 到 硬盘 对象的 存储!!)

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。

只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。

readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。

可以使用 DataInput 上的适当方法从流读取基本数据类型。

默认情况下,对象的反序列化机制会将每个字段的内容恢复为写入时它所具有的值和类型。反序列化进程将忽略声明为瞬态或静态的字段。对其他对象的引用使得根据需要从流中读取这些对象。使用引用共享机制能够正确地恢复对象的图形。反序列化时始终分配新对象,这样可以避免现有对象被重写。

读取对象类似于运行新对象的构造方法。为对象分配内存并将其初始化为零 (NULL)。为不可序列化类调用无参数构造方法,然后从以最接近 java.lang.object 的可序列化类开始和以对象的最特定类结束的流恢复可序列化类的字段。

B:Demo 学习和测试 


代码复制粘贴直接可以运行(异常处理不要太在意(全部抛异常) 理解知识点即可....嘿嘿)

代码结构

Apptest.java

package ankermaker.top.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import ankermaker.top.entity.Student;
public class Apptest {
    /**
     * 序列化 存储 
     * @throws Exception
     * @throws Exception
     * ObjectInputStream 实际上 在 FileInputStream基础 创建的
     */
    public static void readObjext() throws Exception, Exception {
        ObjectInputStream read=new ObjectInputStream(new FileInputStream("c://student.o"));    
        Student s1=(Student) read.readObject();
        Student s2=(Student) read.readObject();
        read.close();
        System.out.println(s1+"####"+s2 );
    }
    public static void writeObject() throws FileNotFoundException, IOException {
        
        ObjectOutputStream write=new ObjectOutputStream(new FileOutputStream("c://student.o"));//序列化 存储 对象 
        write.writeObject(new Student(22,"hy"));
        write.writeObject(new Student(12,"gr"));
        write.close();
    }
    public static void main(String[] args) throws Exception, Exception {        
        readObjext();//反序列化 获取 对象 数据 
//        writeObject();//后面测试 对象的 的获取 时候 注释掉 应为 已经 从内存 中 将 对象保存的 相应的 硬盘中了 
    }

}

 Student.java

package ankermaker.top.entity;

import java.io.Serializable;

/**
 * 对象 输出流 测试 
 * @author Administrator
 * Serializable  序列化 接口
 */
public class Student  implements Serializable{
     
    private static final long serialVersionUID = -3349982764047612364L;
    private int age;
    private String name;
    
    public Student(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    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 [age=" + age + ", name=" + name + "]";
    }

}

 测试结果

WriteObject()测试

readObject()测试

--------------------------------------------------【谢谢查看学习,本人不才,只能多学多积累,欢迎大牛指点】---------------------------------------------------------------

原文地址:https://www.cnblogs.com/Ankermaker/p/7154522.html