什么是java语言中的序列化与反序列化?

序列化和反序列化在Java中是一种常见的编程概念,主要涉及到对象的存储和恢复。

  1. 序列化(Serialization):
    序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化过程中,对象写入流,从而其状态可以稍后恢复。它主要用于在网络上传输对象,或者将对象持久化到数据库,文件系统等存储媒体中。

    在Java中,如果一个类需要被序列化,那么该类必须实现java.io.Serializable接口。这个接口是一个标记接口,没有任何方法需要实现,但可以告诉Java虚拟机这个类可被序列化。

  2. 反序列化(Deserialization):
    反序列化是相反的过程,也就是说,从流中读取字节,并将这些字节转换回原始对象的形式。注意,反序列化读取的字节流必须是由相应Java序列化API序列化的。

    在反序列化过程中,JVM将使用无参数构造函数创建新对象。然后,JVM将从流中读取属性并将其分配给对象。这就是反序列化。

值得注意的是,序列化和反序列化对Java的安全性有影响,因此在使用这两个过程时需要特别注意。另外,transient和static类型的变量不参与序列化过程。

下面是一个使用Java进行序列化和反序列化操作的简单例子:

首先,我们创建一个需要被序列化的类,这个类需要实现java.io.Serializable接口。

package com.xiangpingeasy.learn.demo;

import lombok.Data;
import java.io.Serializable;

@Data
public class Employee implements Serializable {

    public String name;
    public String mobile;
    public transient int age; // transient变量在序例化过程中会被忽略
    
}

然后,我们来执行序列化操作:

package com.xiangpingeasy.learn.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializeDemo {
    public static void main(String[] args) {
        Employee employee = new Employee();
        employee.setName("张三");
        employee.setMobile("13812345678");
        employee.setAge(30);

        try {
            FileOutputStream fileOut = new FileOutputStream("employee.serial");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(employee);
            out.close();
            System.out.println("序例化数据已经保存在employee.serial");
        }catch (IOException ioe){
            ioe.printStackTrace();
        }
    }
}

最后,我们来执行反序列化操作:

package com.xiangpingeasy.learn.demo;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        Employee employee = null;
        try {
            FileInputStream fileIn = new FileInputStream("employee.serial");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            employee = (Employee) in.readObject();
            in.close();
            fileIn.close();
            System.out.println("反序列化:Employee");
            System.out.println("姓名:" + employee.getName()); // 姓名:张三
            System.out.println("手机:" + employee.getMobile()); // 手机:13812345678
            System.out.println("年龄:" + employee.getAge()); // 年龄:0
        }catch (IOException ioe){
            ioe.printStackTrace();
        }catch (ClassNotFoundException c){
            c.printStackTrace();
        }
    }
}

这就是一个简单的Java序列化和反序列化的例子,在上面我们也看到了成员变量age不参与序列化过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值