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

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

三. 反序列化 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

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


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

相关文章
|
1月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
8天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
18天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
21天前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
1月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
36 2
|
18天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
15 0
|
2月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
2月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
33 0