📜  什么是序列化和反序列化放心 - Java (1)

📅  最后修改于: 2023-12-03 14:49:12.077000             🧑  作者: Mango

什么是序列化和反序列化

在Java开发中,我们常常需要对一个Java对象进行持久化,即将其转化为一组字节流并存储到磁盘或在网络传输中传递。而序列化和反序列化正是这一过程中的关键技术。

序列化

序列化是将一个Java对象转化为字节流的过程。通过序列化,我们可以将一个Java对象以一组字节的形式进行传输,存储或共享。当对象需要在不同的虚拟机或者不同的网络间进行传输时,序列化是无法避免的。

在Java中,想要将一个对象进行序列化,需要实现Serializable接口,这是Java提供的一个标识接口,被标记的类的实例都可以进行序列化。

下面是一个例子:

public class Person implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    
    //getters and setters
}

在这个例子中,Person类实现了Serializable接口,也就代表这个类的实例可以被序列化。

反序列化

反序列化是将字节流转化为一个Java对象的过程。通过反序列化,我们可以将从网络或磁盘中获取的字节流转化为Java对象,方便我们进行后续的操作和处理。

在Java中,反序列化需要用到ObjectInputStream类。它可以接收一个字节流并将其反序列化为一个Java对象。下面是一个例子:

public class Main{
    public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("test.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Person person = (Person) ois.readObject();
        ois.close();
        System.out.println(person.getName());
    }
}

在这个例子中,我们先通过FileInputStream将test.txt中的字节流读入内存,然后使用ObjectInputStream进行反序列化,最后将结果转化为Person对象并输出名字。注意需要强制类型转换。

序列化和反序列化的注意点

在进行序列化和反序列化的时候,需要注意以下几点:

  1. 序列化的对象及其所有引用对象都必须实现Serializable接口。
  2. 序列化类的版本号必须与反序列化类的版本号一致,否则会导致反序列化失败。
  3. 序列化的类中的属性必须是基本类型或者实现了Serializable接口的引用类型。
  4. 在对一个对象进行序列化操作时,如果一个对象引用了另一个对象,那么整个对象链都会被序列化,包括对象本身以及所有被它引用的对象。
总结

序列化和反序列化是Java中进行对象持久化的重要技术,通过这种方式,我们可以方便地将一个Java对象进行存储和传输。在进行序列化和反序列化操作时,需要注意版本号、引用类型、链式序列化等问题,以保证操作成功。