0

外部化可能なインターフェースを調査しています。シリアル化されたファイルに、読み取ったものよりも多くのプロパティを書き込むと、奇妙な動作が見つかりました。以下は私の従業員クラスです。

public class Employee implements Externalizable {

    private int id;
    private String name;
    private Boolean isTempEmp;      

    public Employee(int id, String name, Boolean isTempEmp) {
        super();
        this.id = id;
        this.name = name;
        this.isTempEmp = isTempEmp;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", isTempEmp=" + isTempEmp + "]";
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {

        out.writeInt(id);
        out.writeUTF(name);
        out.writeBoolean(isTempEmp);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

        this.id=in.readInt();
        this.name=in.readUTF();
        //this.isTempEmp=in.readBoolean();
    }

}

以下は、ファイル内の従業員オブジェクトを外部化し、ファイルから読み取るための私のクラスです

public class ExternalizeTest2 {

    public static void main(String[] args) {

        Employee emp1=new Employee(1, "Swet", true);
        Employee emp4=new Employee(2, "Varun", true);
        try(OutputStream os=new FileOutputStream("Employee.txt");
                ObjectOutputStream oos=new ObjectOutputStream(os);) {

            emp1.writeExternal(oos);
            emp4.writeExternal(oos);


        }catch (Exception e) {
            e.printStackTrace();
        }

        Employee emp2=new Employee(3, "Test1", false);
        Employee emp3=new Employee(4, "Test2", false);
        try(InputStream is=new FileInputStream("Employee.txt");
                ObjectInputStream ois=new ObjectInputStream(is);) {
            emp2.readExternal(ois);
            emp3.readExternal(ois);


        }catch (Exception e) {
            e.printStackTrace();

        }

        System.out.println("After externalization: \n"+emp2.toString());
        System.out.println(emp3.toString());
    }

}

以下は私が得ている出力です:

java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.readByte(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFChar(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(Unknown Source)
    at java.io.ObjectInputStream.readUTF(Unknown Source)
    at serialization.externalize.Employee.readExternal(Employee.java:40)
    at serialization.externalize.ExternalizeTest2.main(ExternalizeTest2.java:32)


    After externalization: 
    Employee [id=1, name=Swet, isTempEmp=false]
    Employee [id=16777216, name=Test2, isTempEmp=false]

emp3 に割り当てられた ID が 16777216 であることがわかりません。

4

1 に答える 1

0
emp1.writeExternal(oos);
emp4.writeExternal(oos);

あなたはそれを間違っています。これは次のようになります。

oos.writeObject(emp1);
oos.writeObject(emp4);

同様に

emp2.readExternal(ois);
emp3.readExternal(ois);

する必要があります

emp2 = (Employee)ois.readObject();
emp3 = (Employee)ois.readObject();

あなたが持っている方法では、あなたは自分の間違ったメソッドを呼び出しているだけです.シリアライゼーションをまったく行っていません.

于 2017-10-29T09:26:47.187 に答える