2013-05-01 3 views
-1

я имел сериализованные несколько Data и java.lang.Integer объектов, но при чтении объекта данных с помощью потока Data объектов значения не правильно прочитать в то время как в случае java.lang.Integer объектов значение чтения являются правильными.Java объект сериализация проблема при чтении объекта

Data.java

public class Data implements Serializable{ 
    private Integer count ; 
    public void setCount(Integer count) { 
     this.count = count; 
     } 
    public Integer getCount() { 
     return count; 
    } 
} 

SerializationTest.java

public class SerializationTest { 
    public static void main(String[] args) { 
     ObjectOutputStream oos = null; 
     ObjectOutputStream oosD = null; 
     ObjectInputStream ois = null; 
     ObjectInputStream oisD = null; 
     try{ 
      oos = new ObjectOutputStream(new FileOutputStream(new File("integer1.dat"),false)); 
      oosD = new ObjectOutputStream(new FileOutputStream(new File("Data1.dat"),false)); 
      Data data = new Data(); 
      data.setCount(10); 
      oos.writeObject(new Integer(10)); 
      oosD.writeObject(data); 

      data.setCount(100); 
      oos.writeObject(new Integer(100)); 
      oosD.writeObject(data); 

      data.setCount(1000); 
      oos.writeObject(new Integer(1000)); 
      oosD.writeObject(data); 
      oos.close(); 
      oosD.close(); 

      ois = new ObjectInputStream(new FileInputStream(new File("integer1.dat"))); 
      System.out.println("Integer output"); 
      System.out.println("First Object : "+ (Integer)ois.readObject());   
      System.out.println("Second Object : "+ (Integer)ois.readObject()); 
      System.out.println("Third Object : "+ (Integer)ois.readObject()); 
      ois.close(); 
      System.out.println("Data output"); 
      oisD = new ObjectInputStream(new FileInputStream(new File("Data1.dat"))); 
      System.out.println("First Object : "+ ((Data)oisD.readObject()).getCount());    
      System.out.println("Second Object : "+ ((Data)oisD.readObject()).getCount()); 
      System.out.println("Third Object : "+ ((Data)oisD.readObject()).getCount()); 
      oisD.close(); 
     } 
     catch(IOException ioe){ ioe.printStackTrace(); } 
     catch(Exception e){ e.printStackTrace(); } 
    } 
} 

Выход:

Integer output 
First Object : 10 
Second Object : 100 
Third Object : 1000 
Data output 
First Object : 10 
Second Object : 10 
Third Object : 10 

Может кто-нибудь помочь мне выяснить вопрос с Data объекта?

ответ

4

Вы каждый раз сериализуете один экземпляр данных. Java-сериализация хранит ссылки на объекты и просто ссылается на предыдущее хранилище при попытке сохранить один и тот же экземпляр несколько раз (это решает проблемы с циркулярной ссылкой). Создавайте новый экземпляр данных каждый раз.

+0

Как я меняю значение стоимости DATA Затем следует хранить последнее значение не первое значение объекта. –

+0

@AlpeshGediya - я исправил ваше понимание, в какой части моего ответа вы не понимаете? – jtahlborn

+0

поскольку Integer является неизменным классом, если я изменяю значение этого целого числа, тогда их ссылки будут разными, поэтому в этом случае он должен указывать на текущее значение объекта Integer и при изменении ссылки он должен хранить новое значение. –

0

попробовать это:

 Data data = null; 
     data = new Data(); 
     data.setCount(10); 
     oos.writeObject(new Integer(10)); 
     oosD.writeObject(data); 

     data = new Data(); 
     data.setCount(100); 
     oos.writeObject(new Integer(100)); 
     oosD.writeObject(data); 

     data = new Data(); 
     data.setCount(1000); 
     oos.writeObject(new Integer(1000)); 
     oosD.writeObject(data); 
     oos.close(); 
     oosD.close(); 
Смежные вопросы