javaSerializable接口没有功能,为什么会影响"writeObject"/"readObject"
java Serializable interface has no function, why it affects "writeObject"/"readObject"
我查看了
的界面
Serializable
没有函数定义,但是当我定义
private void readObject(ObjectOutputStream oos){
System.out.println("readObject!!");
}
private void writeObject(ObjectOutputStream oos){
System.out.println("writeObject!!");
}
class 中的函数,它们在对象被序列化时被调用。
这对我来说很奇怪,如果接口定义了这两个函数,那么我应该覆盖它们以确保它们被调用。
但是在 Serializable 中,编译器如何生成代码,如果我定义自己的 "writeObject"/"readObject",它们在序列化时被调用?
我尝试追加
@Override
两个函数之上的注释,编译器报告错误。
那么它到底是怎么工作的,你能帮忙解释一下吗?
非常感谢!
java.io.Serializable 是一个功能接口,这意味着它没有在其中定义任何方法。如果你真的想确保没有人会尝试修改你重写的方法,那么@Override 注释就会被放置。您在 @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();
}
}
}
Worker.java
/*
* Worker class, basic type with variables, constructor, and toString() overridden
* Here I have implemented Serializable for the reason that I need to make sure that
* I will serialize the object within the class
*
* Note that I used transient for id. transient is a special keyword which makes sure
* that id will not be serialized, used for security reasons.
*
* serialVersionUID is another variable which is used during deserialization
* to verify that the sender and receiver of a serialized object have loaded
* classes for that object that are compatible with respect to serialization.
* Throws InvalidClassException if the object has a different serialVersionUID
* than that of the corresponding sender's class.
*
*/
import java.io.*;
class Worker implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient int id;
private double wage;
public Worker(String name, int id, double wage){
this.name = name;
this.id = id;
this.wage = wage;
}
public String toString(){
return "Person with name " +
name + " and with id " +
id + " has a salary of " + wage + "$";
}
}
我查看了
的界面Serializable
没有函数定义,但是当我定义
private void readObject(ObjectOutputStream oos){
System.out.println("readObject!!");
}
private void writeObject(ObjectOutputStream oos){
System.out.println("writeObject!!");
}
class 中的函数,它们在对象被序列化时被调用。
这对我来说很奇怪,如果接口定义了这两个函数,那么我应该覆盖它们以确保它们被调用。
但是在 Serializable 中,编译器如何生成代码,如果我定义自己的 "writeObject"/"readObject",它们在序列化时被调用?
我尝试追加
@Override
两个函数之上的注释,编译器报告错误。
那么它到底是怎么工作的,你能帮忙解释一下吗?
非常感谢!
java.io.Serializable 是一个功能接口,这意味着它没有在其中定义任何方法。如果你真的想确保没有人会尝试修改你重写的方法,那么@Override 注释就会被放置。您在 @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();
}
}
}
Worker.java
/*
* Worker class, basic type with variables, constructor, and toString() overridden
* Here I have implemented Serializable for the reason that I need to make sure that
* I will serialize the object within the class
*
* Note that I used transient for id. transient is a special keyword which makes sure
* that id will not be serialized, used for security reasons.
*
* serialVersionUID is another variable which is used during deserialization
* to verify that the sender and receiver of a serialized object have loaded
* classes for that object that are compatible with respect to serialization.
* Throws InvalidClassException if the object has a different serialVersionUID
* than that of the corresponding sender's class.
*
*/
import java.io.*;
class Worker implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient int id;
private double wage;
public Worker(String name, int id, double wage){
this.name = name;
this.id = id;
this.wage = wage;
}
public String toString(){
return "Person with name " +
name + " and with id " +
id + " has a salary of " + wage + "$";
}
}