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

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

一. 为什么要序列化?


上一章节写入文件的员工列表信息数据:


image.png


通过 DataOutputStream 和 DataInputStream ,发现太复杂了,需要固定的格式进行处理, 当数据信息复杂时,就疯了。


我们发现,员工的信息可以封装成一个对象,如 Person 对象, 该对象里面有 id,name,sex,age,desc 属性。


public class Person {
    private int id;
    private String name;
    private  char sex;
    private int age;
    private String desc;
    public Person() {
    }
    public Person(int id, String name, char sex, int age, String desc) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.desc = desc;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", desc='" + desc + '\'' +
                '}';
    }
}


我们存储时,能直接存储对象就好了, 取数据时,直接取对象, 方便操作。

这种形式,其实就是序列化。


序列化是将对象存储到文件里面, 反序列化是将文件转换成对象。


序列化和反序列化所需要的对象为 ObjectOutputStream 和 ObjectInputStream.


二. 序列化 ObjectOutputStream


二.一 方法


二.一.一 构造方法


二.一.一.一 方法


image.png


二.一.一.二 演示


  @Test
    public void objConTest() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data2.txt");
        //传入  outputStream 
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file));
    }


二.一.二 写入方法


image.png


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


二.二 演示 ObjectOutputStream


在序列化对象之前, 必须要保证 那个实体类, 即 Person 类,实现了 java.io.Serializable 接口, 否则会抛出异常的。


public class Person implements Serializable {
}


二.二.一 写入 单个对象


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


大概可以猜测是三部分, 第一部分是 类全限定名称, 第二部分是属性, 第三部分是 数据。


二.二.二 写入集合对象


同样是 writeObject ()方法处理。


   @Test
    public void write2Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data3.txt");
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file));
        Person person1=new Person(1,"两个蝴蝶飞1",'男',24,"一个快乐的程序员1");
        Person person2=new Person(2,"两个蝴蝶飞2",'男',24,"一个快乐的程序员2");
        Person person3=new Person(3,"两个蝴蝶飞3",'男',24,"一个快乐的程序员3");
        Person person4=new Person(4,"两个蝴蝶飞4",'男',24,"一个快乐的程序员4");
        Person[] ps=new Person[]{person1,person2,person3,person4};
        //如果没有序列化,会报错。
        objectOutputStream.writeObject(ps);
        objectOutputStream.close();
    }


运行程序,查看 data3.txt


20200618163022973.png


我们虽然看不懂,但 ObjectInputStream 却能看懂,能解析。

相关文章
|
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的方法将这些字节序列恢复成对象。