对象序列化和反序列化(九)下

简介: 对象序列化和反序列化(九)

三. 反序列化 ObjectInputStream


三.一 方法


三.一.一 构造方法


三.一.一.一 方法


image.png


三.一.一.二 演示


  @Test
    public void readConTest() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data2.txt");
        ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file));
    }


三.一.二 读取方法


image.png


对于 ObjectInputStream 对象,只需要记住 readObject() 方法即可。


三.二 演示 ObjectInputStream


三.二.一 读取序列化的单个对象


  @Test
    public void read1Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data2.txt");
        ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file));
       Object obj= objectInputStream.readObject();
       //向上转型
       Person person=(Person)obj;
        System.out.println("员工:"+person.toString());
        objectInputStream.close();
    }


运行程序,查看控制台打印输出:


20200618163029875.png


三.二.二 读取序列化的对象集合


 @Test
    public void read2Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data3.txt");
        ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file));
        Object readObj= objectInputStream.readObject();
        //对象数组
        Object[] objs=(Object[])readObj;
        for(Object obj:objs){
            //对每一个进行强制转换。
            Person person=(Person)obj;
            System.out.println("员工:"+person);
        }
        objectInputStream.close();
    }


运行程序,查看控制台打印输出:


20200618163035163.png


可以正确的读取。


四. 序列化部分属性 transient


有时候,一个实体类中属性过多,不需要全部保存起来,或者某个属性太重要,需要保证安全,不能存储起来, 那么就需要 使用 transient 关键字进行阻止序列化。


如 阻止序列化 name 和 sex


20200618163040852.png


重新运行一下 write2Test() 和 read2Test() 方法,查看控制台


20200618163045753.png


就发现, name 和 sex 没有被序列化。


五. Externalizable 接口实现序列化


除了 Serializable 接口可以实现序列化外,还可以使用 java.io.Externalizable 接口 进行序列化, 但常用的还是 Serializable 接口, 这个接口 Externalizable 只需要了解即可。


package java.io;
import java.io.ObjectOutput;
import java.io.ObjectInput;
/**
 * @since   JDK1.1
 */
public interface Externalizable extends java.io.Serializable {
    void writeExternal(ObjectOutput out) throws IOException;
    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}


writeExternal() 方法 设置的是 保存哪些属性,


readExternal() 方法,设置的是读取哪些属性。


注意,保存和读取属性的顺序 必须保持一致。


五.一 Externalizable 实现序列化


五.一.一 实体类 实现 接口


public class Person2 implements Externalizable {
}


五.一.二 重写 writeExternal() 方法,设置保存的属性


 @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        //保存哪些, 保存的数据。
        out.writeInt(id);
        out.writeObject(name);
    //不保存 sex 属性
        out.writeInt(age);
        out.writeObject(desc);
    }


五.一.三 重写 readExternal() 方法,读取保存的属性


@Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        //读取的, 按照保存的顺序读取
        this.id=in.readInt();
        this.name=(String)in.readObject();
        this.age=in.readInt();
        this.desc=(String)in.readObject();
    }


五.一.四 序列化单个对象


 @Test
    public void write1Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data4.txt");
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file));
        Person2 Person2=new Person2(1,"两个蝴蝶飞",'男',24,"一个快乐的程序员");
        //如果没有序列化,会报错。
        objectOutputStream.writeObject(Person2);
        objectOutputStream.close();
    }


与 以前的方法是一样的。


运行程序,查看 data4.txt 的内容。


20200618163054878.png


五.一.五 反序列化单个对象


 @Test
    public void read1Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data4.txt");
        ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file));
       Object obj= objectInputStream.readObject();
       Person2 Person2=(Person2)obj;
        System.out.println("员工:"+Person2);
        objectInputStream.close();
    }


运行程序:


2020061816310082.png


对象集合的序列化和反序列化与以前的也是一样的,就不重复写了。


五.二 Serializable 和 Externalizable 的区别


image.png


开发中,常使用的是 Serializable

序列化非常重要,一定要掌握。


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
12天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
59 1
|
12天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
52 1
|
4月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
|
4月前
|
JSON Java 数据库连接
|
5月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
133 2
|
5月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
11月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
386 1
|
11月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
11月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
499 0
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。