Java 序列化-readObject writeObject重写

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

写了下面的代码之后,我现在必须使用StudentData中的custom readObject()和writeObject()重写方法来读写对象的变量。不使用defaultWriteObject或defaultReadObject方法执行此操作

问题是我不完全理解别人要求我做什么。我已经读过了,但是我的头脑还没想清楚。有人能给我指出正确的方向吗

我的代码:

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
}