Java 序列化-readObject writeObject重写
写了下面的代码之后,我现在必须使用StudentData中的custom readObject()和writeObject()重写方法来读写对象的变量。不使用defaultWriteObject或defaultReadObject方法执行此操作 问题是我不完全理解别人要求我做什么。我已经读过了,但是我的头脑还没想清楚。有人能给我指出正确的方向吗 我的代码:Java 序列化-readObject writeObject重写,java,serialization,deserialization,Java,Serialization,Deserialization,写了下面的代码之后,我现在必须使用StudentData中的custom readObject()和writeObject()重写方法来读写对象的变量。不使用defaultWriteObject或defaultReadObject方法执行此操作 问题是我不完全理解别人要求我做什么。我已经读过了,但是我的头脑还没想清楚。有人能给我指出正确的方向吗 我的代码: import java.io.*; //importing input-output files class Student implem
import java.io.*; //importing input-output files
class Student implements java.io.Serializable {
String name; // declaration of variables
String DOB;
int id;
Student(String naam, int idno, String dob) // Initialising variables to user
// data
{
name = naam;
id = idno;
DOB = dob;
}
public String toString() {
return name + "\t" + id + "\t" + DOB + "\t";
}
}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
class StudentData//main class
{
公共静态void main(字符串args[])引发IOException//异常处理
{
System.out.println(“输入学生人数:”);
BufferedReader in=新的BufferedReader(新的InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
学生[]学生=新学生[n];
//Student[]S=new Student[n];//声明和定义的对象数组
for(int i=0;i
您必须这样做:
import java.io.IOException;
class Student implements java.io.Serializable {
String name;
String DOB;
int id;
Student(String naam, int idno, String dob) {
name = naam;
id = idno;
DOB = dob;
}
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.writeObject(name);
stream.writeInt(id);
stream.writeObject(DOB);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
name = (String) stream.readObject();
id = stream.readInt();
DOB = (String) stream.readObject();
}
public String toString() {
return name + "\t" + id + "\t" + DOB + "\t";
}
}
在创建学生实例(绕过普通构造函数)后调用Read Objor。
< P>我知道这个问题已经过时了,请考虑后人 通常,通过允许自动反序列化所有“正常”字段,您可以让JVM完成繁重的工作:private void readObject(ObjectInputStream serialized) throws ClassNotFoundException, IOException
{
serialized.defaultReadObject();
// After this, you can handle transient fields or
// special initialization that happens in the constructor
}
defaultReadObject()
的文档非常清楚地说明了这一点:
从该流中读取当前类的非静态和非瞬态字段。这只能从被反序列化的类的readObject方法调用。如果调用NotActivieException,它将抛出NotActivieException
奇怪的任务。您应该调用defaultWriteObject()和defaultReadObject()。只需在那里指出一个细节。顺序或书写/阅读很重要。在本例中,编写的代码是:name,id,DOB,因此在读取Java序列化框架创建的实例时,您将获得name,id,DOB。它使用内部API来构造对象,而不调用构造函数。显示了类可以实现的其他方法,以拦截对象创建过程或提供不同类型的对象作为序列化表示。当使用defaultReadObject()和writeobject(o)方法时,两者都可以完成任务。
defaultReadObject()
仅在writeobject()时反序列化对象时使用
可以为序列化对象重写。
private void readObject(ObjectInputStream serialized) throws ClassNotFoundException, IOException
{
serialized.defaultReadObject();
// After this, you can handle transient fields or
// special initialization that happens in the constructor
}