java Serializable接口没有功能,为什么它会影响;writeObject“/&引用;readObject“;

java Serializable接口没有功能,为什么它会影响;writeObject“/&引用;readObject“;,java,serialization,serializable,Java,Serialization,Serializable,我检查了 Serializable 没有函数定义,但当我定义 private void readObject(ObjectOutputStream oos){ System.out.println("readObject!!"); } private void writeObject(ObjectOutputStream oos){ System.out.println("writeObject!!"); } 函数,则在序列化对象时调用它们 这对我来说很奇怪,如果接口定义了这

我检查了

Serializable
没有函数定义,但当我定义

private void readObject(ObjectOutputStream oos){
    System.out.println("readObject!!");
}
private void writeObject(ObjectOutputStream oos){
    System.out.println("writeObject!!");
}
函数,则在序列化对象时调用它们

这对我来说很奇怪,如果接口定义了这两个函数,那么我应该重写它们以确保它们被调用

但在Serializable中,若我定义自己的“writeObject”/“readObject”,那个么编译器如何生成在序列化时调用它们的代码

我试图附加

@Override
注释在两个函数的顶部,编译器报告错误

那么它到底是如何工作的,你能帮我解释一下吗


非常感谢

java.io.Serializable是一个函数接口,因此这意味着它不在其中定义任何方法@如果您真的想确保没有人会尝试修改您的重写方法,则会放置重写注释。@Override上出现编译器错误的原因是Serializable中没有此类方法,但您可以在ObjectInputStream和ObjectOutputStream(分别用作低级类FileInputStream和FileOutputStream)中找到它们。 如果你真的想对列表进行序列化,你可以这样做:

package Chaper8.IO;

import java.io.*;

import java.util.*;

public class Serialization_Deserialization {

public static void main(String [] args){

    /*
     *  try-catch with resources, JVM makes sure to close the resources after you've finished using it
     * much easier than using finally and getting an exception for each resource closed
     * 
     */
    try(FileOutputStream out = new FileOutputStream("C:\\Users\\Andrei\\Desktop\\Exemple\\worker.txt");
        ObjectOutputStream oos = new ObjectOutputStream(out);

        FileInputStream in = new FileInputStream("C:\\Users\\Andrei\\Desktop\\Exemple\\worker.txt");
        ObjectInputStream ois = new ObjectInputStream(in);){

        //instances of the Worker class
        Worker w1 = new Worker("Worker1", 123456 , 2000.5);
        Worker w2 = new Worker("Worker2", 765436, 1500.15);
        Worker w3 = new Worker("Worker3", 364582, 1700.45);
        Worker w4 = new Worker("Worker4", 878234, 2100.34);
        ArrayList<Worker> list = new ArrayList<>();

        //just adding the persons in the list
        list.add(w1);
        list.add(w2);
        list.add(w3);
        list.add(w4);


        System.out.println("Doing serialization");
        oos.writeObject(list);

        System.out.println("Doing deserialization");
        ois.readObject();

    }catch(IOException | ClassNotFoundException e){
            e.printStackTrace();
    }
}
} 

Serializable是一个函数接口,因此这意味着它不在其中定义任何方法@如果您真的想确保没有人会尝试修改您的重写方法,则会放置重写注释。@Override上出现编译器错误的原因是Serializable中没有此类方法,但您可以在ObjectInputStream和ObjectOutputStream(分别用作低级类FileInputStream和FileOutputStream)中找到它们。 如果你真的想对列表进行序列化,你可以这样做:

package Chaper8.IO;

import java.io.*;

import java.util.*;

public class Serialization_Deserialization {

public static void main(String [] args){

    /*
     *  try-catch with resources, JVM makes sure to close the resources after you've finished using it
     * much easier than using finally and getting an exception for each resource closed
     * 
     */
    try(FileOutputStream out = new FileOutputStream("C:\\Users\\Andrei\\Desktop\\Exemple\\worker.txt");
        ObjectOutputStream oos = new ObjectOutputStream(out);

        FileInputStream in = new FileInputStream("C:\\Users\\Andrei\\Desktop\\Exemple\\worker.txt");
        ObjectInputStream ois = new ObjectInputStream(in);){

        //instances of the Worker class
        Worker w1 = new Worker("Worker1", 123456 , 2000.5);
        Worker w2 = new Worker("Worker2", 765436, 1500.15);
        Worker w3 = new Worker("Worker3", 364582, 1700.45);
        Worker w4 = new Worker("Worker4", 878234, 2100.34);
        ArrayList<Worker> list = new ArrayList<>();

        //just adding the persons in the list
        list.add(w1);
        list.add(w2);
        list.add(w3);
        list.add(w4);


        System.out.println("Doing serialization");
        oos.writeObject(list);

        System.out.println("Doing deserialization");
        ois.readObject();

    }catch(IOException | ClassNotFoundException e){
            e.printStackTrace();
    }
}
} 

这本质上是一个肮脏的黑客行为。序列化机制通过反射搜索这些方法。编译器不知道这些方法和接口之间存在连接,因此如果名称/签名不正确,则没有帮助。相反,库在运行时查找该方法,如果找到它,它将调用它们。在Java8中,这些方法本可以使用
default
实现,但是在Java1中这是不可用的。这本质上是一个肮脏的黑客行为。序列化机制通过反射搜索这些方法。编译器不知道这些方法和接口之间存在连接,因此如果名称/签名不正确,则没有帮助。相反,库在运行时查找该方法,如果找到它,它将调用它们。在java 8中,这些方法可以使用
default
实现,但是在java 1中这是不可用的。
Serializable
不是“功能接口”。该术语用于描述一个只包含一个抽象方法的接口(并将其用作一个函数)。你要找的短语是“标记接口”。同样是可克隆的,谢天谢地,很少有其他人。同意@TomHawtin tackline的评论,说明Serializable是功能接口的答案怎么可能是有效答案。我还应该指出,尽管在
ObjectInputStream
/
ObjectOutputStream
中有称为
readObject
/
writeObject
的方法,但它们的签名与custom不同
readObject
/
writeObject
之间没有直接关系。
Serializable
不是“功能接口”。该术语用于描述一个只包含一个抽象方法的接口(并将其用作一个函数)。你要找的短语是“标记接口”。同样是可克隆的,谢天谢地,很少有其他人。同意@TomHawtin tackline的评论,说明Serializable是功能接口的答案怎么可能是有效答案。我还应该指出,尽管在
ObjectInputStream
/
ObjectOutputStream
中有称为
readObject
/
writeObject
的方法,但它们的签名与custom不同
readObject
/
writeObject
之间没有直接关系。