java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java序列化与反序列化

Java中序列化与反序列化的定义及代码示例

作者:翠花也老了

序列化是将对象状态转换为可存储或传输格式的过程,反序列化则是将存储或传输格式恢复为原始对象的逆过程,这篇文章主要介绍了Java中序列化与反序列化的相关资料,需要的朋友可以参考下

序列化与反序列化的定义

序列化(Serialization)与反序列化(Deserialization)是编程中常见的两个概念,它们主要涉及到将数据结构或对象状态转换为可以存储或传输的格式,以及将存储或传输的格式转换回原始的数据结构或对象状态的过程。
这两个过程在数据持久化、网络通信、对象深拷贝等多个场景中发挥着重要作用。

序列化(Serialization)

序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。这个格式通常是平台无关的,比如JSON、XML、二进制格式等,以便可以在不同的系统或环境中进行交换。序列化后的数据可以存储在文件中,或者通过网络发送给其他系统。

为什么需要序列化?

反序列化(Deserialization)

反序列化是序列化的逆过程,即将序列化后的数据(如JSON、XML、二进制格式等)转换回原始的数据结构或对象状态。这个过程允许程序在需要时重新构建对象,并使用其原始数据。

为什么需要反序列化?

Java的序列化

Java序列化是指将Java对象的状态转换为可以保存或传输的格式的过程。Java提供了多种序列化方式,以满足不同的需求和场景。以下是Java序列化的几种主要方式:

1. 实现Serializable接口

2. 实现Externalizable接口

3. 使用JSON序列化库

4. 使用XML序列化库

5. 使用二进制序列化库

6. 其他序列化方式

Java提供了多种序列化方式,每种方式都有其特点和适用场景。在实际应用中,可以根据具体需求和场景选择合适的方式进行Java对象的序列化。需要注意的是,除了Java默认的序列化方式外,其他方式通常需要引入相应的第三方库。

Java默认序列化与反序列化示例

我们先将一些Java的变量和一个Car对象序列化到 d盘的一个名为 data.dat 的文件中。

/**
 * ObjectOutputStream 的使用,完成数据的序列化
 * ObjectOutputStream 是序列化
 */
public class ObjectOutputStreamDemo {

    public static void main(String[] args) throws IOException {
        //序列化后,保存到文本格式不是纯文本txt,而是按照它的格式来保存
        String filePath = "d:\\data.dat";

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
        oos.writeInt(100);//int -> Integer(实现了Serializable)
        oos.writeBoolean(true);//boolean -> Boolean(实现了 Serializable)
        oos.writeChar('o');//char -> Character(实现了Serializable)
        oos.writeDouble(4.4);//double -> Double(实现了 Serializable)
        oos.writeUTF("对象输出流");//String (实现了Serializable)
        oos.writeObject(new Car("xiaomi su7","Pro","Gulf Blue","300,000"));
        oos.close();
        System.out.println("数据以序列化的形式保存完成");
        /*
        如果Car没有实现 Serializable接口,会报错如下:
        Exception in thread "main" java.io.NotSerializableException: org.example.io.demo.lession20.Car
        	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	        at org.example.io.demo.lession20.ObjectOutputStreamDemo.main(ObjectOutputStreamDemo.java:24)
         */
    }
}

@Data
class Car implements Serializable {
    private String name;
    private String type;
    private static String color ;
    private transient String price ;

    public Car(String name,String type,String color,String price){
        this.name = name;
        this.type = type;
        this.color = color;
        this.price = price;
    }
}

执行main方法后,会在d盘根目录下看到一个 data.dat的文件。

使用记事本打开,依稀可以看到点什么,但明显不是txt格式的文本。

下面我们将这个文件反序列化至程序中并打印出来:

/**
 * 读取序列化文件,并通过反序列化恢复数据
 * ObjectInputStream 是反序列化
 */
public class ObjectInputStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //指定反序列化的文件
        String filePath = "d:\\data.dat";
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        //读取(即反序列化)的顺序需要和保存数据(即序列化)的顺序一致,否则会有异常
        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readChar());
        System.out.println(ois.readDouble());
        System.out.println(ois.readUTF());
        System.out.println(ois.readObject().toString());
        ois.close();
    }
}

输出结果为:

100
true
o
4.4
对象输出流
Car(name=xiaomi su7, type=Pro, price=null)

Java 序列化与反序列化注意事项:

TIPS:static 和 transient 在序列化中的区别

static关键字

transient关键字

二者对比表格

关键字定义序列化行为反序列化影响
static修饰类变量或类方法,属于类本身不被序列化保持JVM中的当前值
transient修饰成员变量,指示在序列化时忽略该变量被忽略,不被序列化被初始化为默认值

总结 

到此这篇关于Java中序列化与反序列化的文章就介绍到这了,更多相关Java序列化与反序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文