📜  Java中带有继承的对象序列化(1)

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

Java中带有继承的对象序列化

在Java中,对象序列化是指将对象转换为可存储或可传输的格式的过程。对象序列化通常用于将对象保存到文件中,或者将对象传输到网络上的另一台计算机。Java中的对象序列化可以通过实现Serializable接口来实现。在继承关系中,如果父类和子类都需要序列化,那么需要对父类和子类都实现序列化接口。

实现序列化接口

通过实现Serializable接口,可以让Java对象变为可序列化的对象。如果需要在序列化过程中考虑到继承关系,则需要在父类和子类中都实现Serializable接口。下面是一个示例代码:

import java.io.Serializable;

public class Animal implements Serializable {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Dog extends Animal implements Serializable {
    private String breed;

    public Dog(String name, int age, String breed) {
        super(name, age);
        this.breed = breed;
    }

    public String getBreed() {
        return breed;
    }
}

在上面的示例代码中,Animal和Dog都实现了Serializable接口。子类Dog通过super调用父类的构造方法,并添加了名为breed的成员变量。

序列化对象

在Java中,使用ObjectOutputStream类可以序列化对象。下面是一个序列化Animal和Dog对象的示例代码:

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

public class SerializationDemo {
    public static void main(String[] args) {
        Animal animal = new Animal("Cat", 5);
        Dog dog = new Dog("Dog", 3, "Golden Retriever");

        try {
            FileOutputStream fileOut = new FileOutputStream("animals.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(animal);
            out.writeObject(dog);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in animals.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

上面的示例代码将Animal和Dog对象序列化到文件animals.ser中。ObjectOutputStream的writeObject方法将对象写入文件中。在序列化过程中,Dog类中的成员变量也会被序列化在一起。

反序列化对象

在Java中,使用ObjectInputStream类可以反序列化对象。下面是一个反序列化Animal和Dog对象的示例代码:

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

public class DeserializationDemo {
    public static void main(String[] args) {
        Animal animal;
        Dog dog;

        try {
            FileInputStream fileIn = new FileInputStream("animals.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            animal = (Animal) in.readObject();
            dog = (Dog) in.readObject();
            in.close();
            fileIn.close();
        } catch (IOException i) {
            i.printStackTrace();
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Animal or Dog class not found");
            c.printStackTrace();
            return;
        }

        System.out.println("Deserialized Animal data:");
        System.out.println("Name: " + animal.getName());
        System.out.println("Age: " + animal.getAge());

        System.out.println("Deserialized Dog data:");
        System.out.println("Name: " + dog.getName());
        System.out.println("Age: " + dog.getAge());
        System.out.println("Breed: " + dog.getBreed());
    }
}

上面的示例代码从文件animals.ser中读取并反序列化Animal和Dog对象。ObjectInputStream的readObject方法读取文件中的对象。由于在序列化时,Dog类也被序列化在一起,因此可以通过强制类型转换,将读取到的对象转换成对应的类型。最后输出反序列化后的Animal和Dog对象中的成员变量。

总结

使用Java中的对象序列化可以将对象转换为可存储或可传输的格式,方便地进行文件存储或网络传输。在继承关系中,需要同时在父类和子类中实现Serializable接口,才能正确地将父类和子类对象序列化和反序列化。