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

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

一. 为什么要序列化?


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


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 却能看懂,能解析。

相关文章
|
29天前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
1月前
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
|
1月前
|
存储 Java 数据库
|
3月前
|
Go
golang力扣leetcode 297.二叉树的序列化与反序列化
golang力扣leetcode 297.二叉树的序列化与反序列化
24 0
|
3月前
|
存储 算法 C++
leetcode-297:二叉树的序列化与反序列化
leetcode-297:二叉树的序列化与反序列化
22 1
|
3月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
53 0
|
6天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
15 5
|
29天前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
11 0
|
1月前
|
JSON Java Maven
使用Jackson进行 JSON 序列化和反序列化
使用Jackson进行 JSON 序列化和反序列化
23 0
|
1月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案

热门文章

最新文章