2017-10-29 29 views
0

私は外部化可能なインタフェースを探索中です。シリアライズされたファイルに、私が読んだものよりも多くのプロパティを書き込んだとき、私は奇妙な動作を見つけました。以下は私の従業員クラスです。 IDが割り当てられているか書き込み外部が読み込み外部よりも多くのプロパティを持っているときに外部化可能なインタフェースの動作

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] 

わからない:

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()); 
    } 

} 

からファイルに従業員オブジェクトを外部化し、読みのための私のクラスですto emp3は16777216です。

答えて

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(); 

あなたがそれを持っている方法である必要があり、あなたは自分自身、間違って、メソッドを呼び出している:でシリアル化をしていませんすべて。

関連する問題