Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java序列化如何在内部工作?_Java_Serialization - Fatal编程技术网

java序列化如何在内部工作?

java序列化如何在内部工作?,java,serialization,Java,Serialization,我阅读了有关Java序列化的内容,并了解到若实现了可序列化接口,那个么类将被序列化 但是Serializable是一个标记接口。那么JVM如何知道应该使用哪些方法进行序列化或反序列化呢 据我所知,接口中声明的方法是通过多态性调用的 下面我举一个例子来说明我的问题 public class MySerializable implements Serializable{ public void serialize(){ //Some code to serialize

我阅读了有关Java序列化的内容,并了解到若实现了可序列化接口,那个么类将被序列化

但是Serializable是一个标记接口。那么JVM如何知道应该使用哪些方法进行序列化或反序列化呢

据我所知,接口中声明的方法是通过多态性调用的

下面我举一个例子来说明我的问题

    public class MySerializable implements Serializable{

    public void serialize(){

      //Some code to serialize to a file output stream.
    }

    public void deSerialize(){

      //Some code to de-serialize to a file input stream.
    }


}
那么现在JVM将如何调用方法序列化/反序列化呢


若我必须通过代码手动调用它们,那个么为什么要让编译器知道实现了可序列化接口?

是的,可序列化接口并没有任何实现方法。若要序列化对象,对象必须实现可序列化接口。接下来,可以对对象执行序列化/反序列化过程,例如使用ObjectOutputStream和ObjectInputStream对象

没有什么例子

类,该类需要序列化/反序列化:

import java.io.Serializable;

public class ObjectToSerialize implements Serializable {

    private static final long serialVersionUID = 7526472295622776147L;

    private String firstName;
    private String lastName;

    public ObjectToSerialize(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    @Override
    public String toString() {
        return getFirstName() + " " + getLastName();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ObjectToSerialize that = (ObjectToSerialize) o;
        return firstName.equals(that.firstName) && lastName.equals(that.lastName);
    }
}
使用序列化/反序列化方法初始化:

import java.io.*;

public class ObjectSerialization {

    public static void saveObject(Serializable object, String path) throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path))) {
            oos.writeObject(object);
        }
    }

    public static Object loadObject(String path) throws ClassNotFoundException, IOException {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))) {
            return ois.readObject();
        }
    }

    public static void main(String[] args) {
        ObjectToSerialize object = new ObjectToSerialize("Eldar", "Agalarov");
        try {
            String path = "C:/object.bin";
            saveObject(object, path);
            System.out.println("Object serialized: " + object);

            ObjectToSerialize deserializedObject = (ObjectToSerialize) loadObject(path);
            System.out.println("Object deserialized: " + deserializedObject);
            System.out.println("They are equals: " + object.equals(deserializedObject));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

也请阅读

以下是Jon Skeet关于java序列化的伟大答案,这可能是您问题的答案。我认为上述答案与问题不符。问题是JVM如何知道应该使用哪些方法进行序列化或反序列化。。。。。。然后JVM将如何调用方法序列化/反序列化?