Serializable是什么意思?

问题

在Java中,一个类到Serializable究竟是什么意思?或者一般来说,就此而言......


#1 热门回答(106 赞)

Serialization将对象从内存持久保存到一系列位,例如用于保存到磁盘上。反序列化是相反的 - 从磁盘读取数据以水合/创建对象。

在你的问题的上下文中,它是一个接口,如果在类中实现,该类可以由不同的序列化程序自动序列化和反序列化。


#2 热门回答(33 赞)

这意味着类的实例可以转换为字节流(例如,保存到文件中),然后再次转换回类。这种重新加载可能发生在程序的不同实例中,甚至可能发生在不同的机器上。序列化(使用任何语言)涉及各种问题,尤其是当你可以引用可序列化的其他对象时。


#3 热门回答(32 赞)

虽然大多数用户已经给出了答案,但我想为那些需要它的人添加一个例子来解释这个想法:

假设你有一个类人,如下所示:

public class Person implements java.io.Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public String firstName;
    public String lastName;
    public int age;
    public String address;

    public void play() {
        System.out.println(String.format(
                "If I win, send me the trophy to this address: %s", address));
    }
    @Override
    public String toString() {
        return String.format(".....Person......\nFirst Name = %s\nLast Name = %s", firstName, lastName);
    }
}

然后你创建一个这样的对象:

Person william = new Person();
        william.firstName = "William";
        william.lastName = "Kinaan";
        william.age = 26;
        william.address = "Lisbon, Portugal";

你可以将该对象序列化为多个流。我会这样做两个流:
序列号到标准输出:

public static void serializeToStandardOutput(Person person)
            throws IOException {
        OutputStream outStream = System.out;
        ObjectOutputStream stdObjectOut = new ObjectOutputStream(outStream);
        stdObjectOut.writeObject(person);
        stdObjectOut.close();
        outStream.close();
    }

序列化到文件:

public static void serializeToFile(Person person) throws IOException {
        OutputStream outStream = new FileOutputStream("person.ser");
        ObjectOutputStream fileObjectOut = new ObjectOutputStream(outStream);
        fileObjectOut.writeObject(person);
        fileObjectOut.close();
        outStream.close();
    }

然后:
从文件中反序列化:

public static void deserializeFromFile() throws IOException,
            ClassNotFoundException {
        InputStream inStream = new FileInputStream("person.ser");
        ObjectInputStream fileObjectIn = new ObjectInputStream(inStream);
        Person person = (Person) fileObjectIn.readObject();
        System.out.println(person);
        fileObjectIn.close();
        inStream.close();
    }