Java中的序列化和反序列化

序列化的作用就是通过将对象写进文件中,来永久化的保存对象中的数据结构,这样可以防止它在在消耗内存中的资源。

序列化:通过将对象转换成字节码序列

反序列:就是序列化的逆操作,就是将字节码文件转换成对象

使用序列化和反序列化,要用到两个实现类分别是ObjectInputStream,ObjectOutputStre这两类是继承InputStream,OutputStream这两个抽象类,下面是这两个实现类的构造方法

 

 它们所接受的参数是InputStream,OutputStream的实现类,可以是Buffered,也可以是FileInputstream,FileOutputStream(这两个是FilterInputStream,FileOutputStream的实现类),

那么如何去序列化对象呢,首先我们需要去定义一个对象,如图

public class Student {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public Student() {
    }

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

当然这个类建立之后并不能,对它进行序列化,还需要实现一个接口Serializable,这是一个标记,意思是这个类的对象可以序列化,我们看一看这个接口里实现了什么,如图

这里面什么都没有

那具体的实现该怎么做,我们发现,序列化和反序列化有两个方法分别是writeObject(),readObject(),如图

看不懂这些也能序列化对象

准备条件之后,下图是具体操作 

import java.io.*;

public class Test {
    public static void main(String[] args) {
//        FileInputStream fis=null;
        FileOutputStream fos=null;
        try {
//            fis=new FileInputStream("student.txt");
            fos=new FileOutputStream("student.txt");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
//        ObjectInputStream ois=null;
        ObjectOutputStream oos=null;
        try {
//            ois=new ObjectInputStream(fis);
            oos=new ObjectOutputStream(fos);
            Student st=new Student("1212","王小胖");
            oos.writeObject(st);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

下面是对象转换成了字节码,能看出来这个对象的id是1212,名字是王小胖

 进行完序列化,下面是反序列化

如图

import java.io.*;

public class Test {
    public static void main(String[] args) {
        FileInputStream fis=null;
        try {
            fis=new FileInputStream("student.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        ObjectInputStream ois=null;
        try {
            ois=new ObjectInputStream(fis);
            Student st=(Student)ois.readObject();
            System.out.println(st);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

下面是控制台输出

如图 

这和我们写入的对象完全一致,以上就是对象序列化和反序列化的基本操作了​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值