2014-08-27 5 views
0

하나의 정적 멤버로 직렬화 테스트 용 코드가 있습니다. 여기 HashCode 메서드로 직렬화

public class Car implements Serializable { 

    private String number; 
    private String color; 
    private String model; 
    static int y = 23; 

    public boolean equals(Object object) 
    { 
     System.out.println("Equals Called..."); 
     if(object instanceof Car) 
     { 
      Car car = (Car) object; 
      if(car.getNumber() == this.number) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    public String toString() 
    { 
     System.out.println("ToString Called..."); 
     return "Number : "+this.number+" Color : "+this.color+" Model : "+this.model+" Y : "+this.y; 
    } 

    public int hashCode() 
    { 
     return this.y * 23; 
    } 

    Getters And Setters 
} 

자동차 클래스

이며, 여기에 내 메인 클래스

public static void main(String args[]) 
    { 
     Car car1 = new Car(); 
     car1.setColor("red"); 
     car1.setModel("23023"); 
     car1.setNumber("1212"); 
     System.out.println(car1.toString()); 

     Car car2 = new Car(); 
     car2.setColor("red"); 
     car2.setModel("23023"); 
     car2.setNumber("1212"); 
     System.out.println(car2.toString()); 

     Map<Car, String> map = new HashMap<Car, String>(); 
     map.put(car1, "Kshitij_1"); 

     System.out.println("Map : "+map.toString()); 
     System.out.println(map.get(car2)); 
     System.out.println(car2.getY()); 
     System.out.println("---------------------------------------------Before"); 
     try 
     { 
      FileOutputStream fout = new FileOutputStream("D://map.ser"); 
      ObjectOutputStream objectOutputStream = new ObjectOutputStream(fout); 
      objectOutputStream.writeObject(map); 
      objectOutputStream.close(); 

      FileInputStream fin = new FileInputStream("D://map.ser"); 
      ObjectInputStream inputStream = new ObjectInputStream(fin); 
      map = (Map<Car, String>) inputStream.readObject(); 
      inputStream.close(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     System.out.println("Map : "+map.toString()); 
     System.out.println(map.get(car2)); 
     System.out.println(car2.getY()); 
     System.out.println("---------------------------------------------After"); 
} 

내 기대는 그 결과가 이전과 이후 동일해야합니다입니다. 하지만 정적 변수 값을 기본값으로 초기화됩니다 직렬화 복원 과정에서 직렬화 규칙에 따르면

System.out.println(map.get(car2)); 

에 널

출력

ToString Called... 
Map : {Number : 1212 Color : red Model : 23023 Y : 23=Kshitij_1} 
Equals Called... 
Kshitij_1 
23 
---------------------------------------------Before 
ToString Called... 
Map : {Number : 1212 Color : red Model : 23023 Y : 23=Kshitij_1} 
Equals Called... 
null 
23 
---------------------------------------------After 

을 얻고있다. 그것의 HashMap에서 Object를 찾을 수없는 이유보다 23으로 초기화한다면?

답변

0

정적 필드는 빨간 청어입니다 (그리고 내가 다시 생각해 볼 것을 제안합니다). 그러나 지금은 해시 맵을 버리고있는 버그가있는 equals 체크입니다.

if(car.getNumber() == this.number) 

당신은 문자열 리터럴하지만 직렬화 문자열로 발생하는 자동 문자열 인턴에 의해 적발 된

if(Objects.equals(car.getNumber(), this.number)) 

해야한다. 자세한 내용은 What is a string literal pool을 읽으십시오.

+0

좀 더 읽을 수있는'if (car.getNumber(). equals (this.number))'를 사용할 수도 있습니다. IMHO – rthur

+0

Perfect ......... – KSHiTiJ