有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我阅读了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将如何调用方法序列化/反序列化呢

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


共 (1) 个答案

  1. # 1 楼答案

    是的,Serializable接口没有任何实现方法。如果要序列化对象,对象必须实现可序列化接口。接下来,可以对对象执行序列化/反序列化过程,例如使用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();
            }
        }
    }
    

    也读this guide about serialization