2018026-Java中如何实现序列化和反序列化

本文介绍Java中对象序列化与反序列化的概念及其应用场景,包括分布式系统中的对象传输及服务器钝化等。同时讲解了序列化过程中需要注意的问题,如静态成员变量和用transient修饰的变量的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 概念
    序列化:将堆内存中的java对象转化成字节数组。
    反序列化:将字节数组恢复成java对象。

  2. 为什么要序列化

    • 分布式系统中传输需要。在分布式系统中,要在网络上传输对象,就需要将之转化成二进制。
    • 服务器钝化。当服务器发现某些对象长时间不被使用,就会将这些内存中的对象保存到磁盘文件中(Java对象转换为二进制文件)。当服务器发现某些对象需要活动,就会先到内存中查找,如果查找不到,就会到磁盘中查找,并将磁盘中的二进制文件反序列化成对象。
  3. 需要注意的地方

    • 对象序列化保存的是对象状态,即成员变量。
    • 静态成员变量属于类,不属于对象,因此不可序列化
    • 用transient标识的成员变量,不参与序列化。在反序列化后,transient标识的成员变量被初始化成初始值,如int初始化成 0 等。
  4. 如何实现序列化和反序列化

    • 实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法)
    • 使用对象流来完成序列化和反序列化
public class Person implements Serializable{
    private String name;
    transient private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
}  
//在根目录下新建一个 io 的文件夹
OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");
ObjectOutputStream ops = new ObjectOutputStream(op);
ops.writeObject(new Person("vae",1));
ops.close();
InputStream in = new FileInputStream("io"+File.separator+"a.txt");
ObjectInputStream os = new ObjectInputStream(in);
byte[] buffer = new byte[10];
int len = -1;
Person p = (Person) os.readObject();
System.out.println(p);  //Person [name=vae, age=1]
os.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值