2013-04-09 2 views
0

내가 이런 데이터 모델이 벡터에 JSON 변환. 벡터를 json 문자열로 변환했습니다. 몇 가지 검사를 다시 한 후 json 문자열을 벡터로 변환했습니다. 벡터 안에 올바른 수의 요소와 데이터가 표시됩니다. 그러나 하나의 객체의 위치를 ​​얻으려고 할 때 -1을 반환합니다. vector.remove()를 사용하더라도 객체를 제거 할 수 없습니다. 벡터를 json 문자열로 변환하지 않으면 정상적으로 작동합니다. Vector#remove가 사용하는 인덱스를 얻기를 위해 다음과 같은 때문에

 Gson gson = new Gson(); 
     Vector vecResult = new Vector(); 

     Person person = new Person(); 
     person.name = "ABC"; 
     person.id = new Integer(1001); 

     vecResult.add(person); 

     Person person2 = new Person(); 
     person2.name = "DEF"; 
     person2.id = new Integer(1002); 

     vecResult.add(person2); 

     String json = gson.toJson(vecResult); //successful 

     Type token = new TypeToken<Vector<Person>>() {}.getType(); 
     Vector<Person> vecResults = gson.fromJson(json3, token); //vecResults got 2 objects 
     int pos = vecResults.indexOf(person); //returning -1 
     boolean isRemoved = vecResults.remove(person); // returning false 

답변

1

당신은

boolean equals(Object obj) 
int  hashCode() 

귀하의 코드가 작동하지 않는 경우 다음 재정의해야 : 다음은 내 코드입니다.

public boolean equals(Object obj) { 
    return (this == obj); 
    } 
1

당신의 Person 클래스 equals() (또는 hashCode())를 오버라이드 (override)하지 않는 다음과 같음에 대한

public synchronized int indexOf(Object o, int index) { 
    if (o == null) { 
     for (int i = index ; i < elementCount ; i++) 
     if (elementData[i]==null) 
      return i; 
    } else { 
     for (int i = index ; i < elementCount ; i++) 
     if (o.equals(elementData[i])) 
      return i; 
    } 
    return -1; 
    } 

유의하시기 바랍니다 디폴트의 구현입니다. 지금까지 indexOfremove로 완전히 원래의 것과 비 동일 우려 - Person의 새로운 인스턴스를 생성합니다

당신이 JSON으로 직렬화하고 역 직렬화

. 그들은 같은 nameid 값을 가지지 만, 자동으로 같지는 않습니다.

원하는 평등의 의미가 무엇이든 Object.equals()Object.hashCode()을 덮어 씁니다 (이름은? 그냥 ID입니까? 둘 모두?) 괜찮을 것입니다.

일반적으로 필드를 비공개로 설정하고 속성 getter/setter를 제공하는 것이 좋습니다.

0

remove()는 equals() 메소드를 통해 객체를 처리하려고 시도합니다. 기본적으로 이는 개체 ID입니다. 사람에 대한 명시 적 equals() 메소드를 생성하십시오 (모든 필드를 사용하여 생성 할 수 있습니다). (equals()를 재정의하는 경우 일치하는 hashcode() 메서드가 있어야 함)