readExternal()没有按预期工作?

时间:2016-01-26 23:28:56

标签: java serialization externalizable

我在这个例子中使用Externalization。首先,我使用writeExternal()方法将对象序列化为名为“tmp”的文件。但是当我使用readExternal()对其进行反序列化时,我得到的输出如下...

default
The original car is name=Maruti
year2009
age10
The new Car is name=null
year0
age10

为什么汽车的名称和年份没有序列化?如果序列化,为什么我将null0作为其值...请指定..

import java.io.*;

class Car implements Externalizable
{

    String name;
    int year;

    static int age;
    public Car()
    {
        super();
        System.out.println("default");
    }

    Car(String n,int y)
    {
        name=n;
        year=y;
        age=10;
    }

    public void writeExternal(ObjectOutput out) throws IOException
    {
        out.writeObject(name);
        out.writeInt(year);
        out.writeInt(age);
    }

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    {
        while(in.available()>0){
            name=(String)in.readObject();
            year=in.readInt();
            age=in.readInt();
        }
    }

    public String toString() 
    {
        return("name="+name+"\n"+"year"+year+"\n" +"age" +age);
    }
}

public class ExternExample
{
    public static void main(String args[])
    {
        Car car=new Car("Maruti",2009);
        Car newCar=null;
        try{
           FileOutputStream fout=new FileOutputStream("tmp");
           ObjectOutputStream so=new ObjectOutputStream(fout);
           so.writeObject(car);
           so.flush();
        }
        catch(Exception e){System.out.println(e);}
        try
        {
            FileInputStream fis=new FileInputStream("tmp");
            ObjectInputStream oin=new ObjectInputStream(fis);
            newCar = (Car) oin.readObject();
        }
        catch(Exception e){System.out.println(e);}
        System.out.println("The original car is "+car);
        System.out.println("The new Car is "+newCar);
    }
}**

1 个答案:

答案 0 :(得分:3)

摆脱循环和available()测试。你只写了一个对象,所以你应该只读一个对象,所以没有理由循环,更不用说调用available()了。该方法几乎没有正确的用法,这不是其中之一。

如果您延长了Serializable而不是Externalizable,并且只是移除了read/writeExternal()方法,那么它也可以正常工作。

您的主要方法并未关闭ObjectOutputStreamObjectInputStream.