📜  Java中的自定义序列化和反序列化(1)

📅  最后修改于: 2023-12-03 15:32:02.141000             🧑  作者: Mango

Java中的自定义序列化和反序列化

Java中的序列化(Serialization)是指将对象转化成可存储或传输的格式。反序列化(Deserialization)则是将序列化的数据重新还原为对象。Java提供了默认的序列化和反序列化方法,但是在某些情况下,我们需要对对象的序列化过程进行定制化,这就是自定义序列化和反序列化。

如何实现自定义序列化和反序列化

要自定义序列化和反序列化,需要让类实现Serializable接口,并自定义writeObject和readObject方法。

writeObject方法
private void writeObject(java.io.ObjectOutputStream out)
        throws IOException {
    out.defaultWriteObject(); // 调用默认的序列化方法
    out.writeInt(age); // 自定义序列化
}

在自定义序列化方法中,需要先调用默认的序列化方法,将对象的默认属性写入到输出流中,然后再写入自定义属性。在上述代码中,我们首先调用了默认的序列化方法,然后再写入了对象的age属性。这样,我们就完成了自定义序列化的过程。

readObject方法
private void readObject(java.io.ObjectInputStream in)
        throws IOException, ClassNotFoundException {
    in.defaultReadObject(); // 调用默认的反序列化方法
    age = in.readInt(); // 自定义反序列化
}

在自定义反序列化方法中,同样需要先调用默认的反序列化方法,将对象的默认属性读出来,然后再读出自定义属性。在上述代码中,我们首先调用了默认的反序列化方法,然后再读出了对象的age属性。这样,我们就完成了自定义反序列化的过程。

序列化和反序列化的实例
public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    private void writeObject(java.io.ObjectOutputStream out)
            throws IOException {
        out.defaultWriteObject();
        out.writeInt(age);
    }

    private void readObject(java.io.ObjectInputStream in)
            throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        age = in.readInt();
    }
}

我们定义了一个Person类,实现了Serializable接口,并自定义了writeObject和readObject方法。现在我们可以进行序列化和反序列化的测试。

序列化
public static void serialize(Person person, String fileName) throws IOException {
    FileOutputStream fileOut = new FileOutputStream(fileName);
    ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
    outStream.writeObject(person);
    outStream.close();
    fileOut.close();
}

在序列化方法中,我们首先创建一个文件输出流,然后创建一个对象输出流,并将Person对象写入到输出流中。最后关闭输出流和文件输出流。

反序列化
public static Person deserialize(String fileName) throws IOException, ClassNotFoundException {
    FileInputStream fileIn = new FileInputStream(fileName);
    ObjectInputStream in = new ObjectInputStream(fileIn);
    Person person = (Person) in.readObject();
    in.close();
    fileIn.close();
    return person;
}

在反序列化方法中,我们首先创建一个文件输入流,然后创建一个对象输入流,从输入流中读取Person对象。最后关闭输入流和文件输入流,并返回读取到的Person对象。

总结

自定义序列化和反序列化是一种定制化的序列化方式,可以让我们对序列化的过程做出个性化的调整。虽然使用起来需要一定的注意点,但是当我们需要对数据进行更精细的控制时,自定义序列化和反序列化是非常好的选择。