2012-05-16 3 views
5

나는 다음과 같은 코드를 사용하여 내 PC의 응용 프로그램에서의 HashMap를 직렬화하고있는 그런 다음HashMap의 역 직렬화 문제 안드로이드

private void serialize(HashMap<Integer, Integer> map2write, String name_ser) 
{// serializes fphlist into .ser file called name_ser 
    FileOutputStream fileOut = null; 
    try { 
     fileOut = new FileOutputStream(project_dir + "/" + name_ser + ".ser"); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(AdminConsoleUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    ObjectOutputStream out; 
    try { 
     out = new ObjectOutputStream(fileOut); 
     out.writeObject(map2write); 
     out.reset(); 
     out.flush(); 
     out.close(); 
     fileOut.close(); 

    } catch (IOException ex) { 
     Logger.getLogger(AdminConsoleUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

이 코드 내 안드로이드 응용 프로그램에서 직렬화 끊긴 부하 오전 :

private HashMap<Integer,Integer> deserialize_Map(String fn) 
{// deserializes fn into HashMap 

    HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>(); 
    try 
    { 
     FileInputStream fileIn = new FileInputStream(project_dir + "/" + fn + ".ser"); 
     ObjectInputStream in = new ObjectInputStream(fileIn); 
     hm = (HashMap<Integer,Integer>) in.readObject(); 
     in.close(); 
     fileIn.close(); 

    }catch(IOException i) 
    { 
     Log.e("MYAPP", "exception", i); 
     return null; 
    }catch(ClassNotFoundException c) 
    { 
     Log.e("MYAPP", "exception", c); 
     return null; 
    }catch(ClassCastException ex) 
    { 
     Log.e("MYAPP", "exception", ex); 
     return null; 
    } 

    return hm; 
} 

결국 두 가지 문제점에 직면하고 있습니다.

1) 역 직렬화는 매우 오랜 시간이 걸립니다. 수천 개의 키가 포함되어 있으므로 정상입니까? 거기에 더 효과적인 직렬화 방법이 있습니까?

2) 역 직렬화 후, VM에서 원래 차지하는 크기의 거의 두 배가되는 해시 맵을 얻습니다. 그리고 디버거에서 검사 할 때 원래 들어 있어야하는 키 값 사이에 많은 null 항목이 있습니다. 그러나, 그들은 null 키가 아니라 단지 null이며, 나는 그 안에 무엇이 있는지 볼 수 없습니다. Eclipse에서 디버깅합니다. 왜 그런 일이 일어 났을까요?

답변

3

1) VM 크기의 "일반"HashMap의 크기는 얼마입니까? 그 문제에 대한 해결책이 다른 해결책이라고 생각하지 않습니다. sqlite 또는 다른 것을 공유 할 수 있습니다. 당신은 당신이 우리가 더 빨리 작업을 학술적 제안 할 수 해결하기 위해 시도하고있는 무슨 colaborate 싶은 경우에

업데이트

당신은 당신이 제안 대용량 경우에, 초기화 시간에지도를 초기화 시도 할 수 있습니다 초기 용량과 부하 FAC : 당신은 here

의 HashMap의 인스턴스가이 성능에 영향을주는 매개 변수가에서 2의 크기 HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>(SIZE*2);

을 알고 토르. 용량은 해시 테이블의 버킷 수이며 초기 용량은 단순히 해시 테이블을 만들 때의 용량입니다. 부하 계수는 용량이 자동으로 증가하기 전에 해시 테이블이 얼마나 채워지는지 측정합니다. 해시 테이블의 항목 수가로드 요소와 현재 용량의 곱을 초과하면 재해 메서드를 호출하여 용량을 대략 두 배로 늘립니다.

+0

감사합니다. 정말 도움이됩니다. 나는 HashMap 매개 변수를 가지고 놀 수 있다는 것을 결코 알지 못했다. 초기화하는 동안로드 요소와 용량을 지정하면 도움이됩니다. – Erol

+0

deserialization 전에 HashMap을 만들고 readObject 메서드를 사용하여 해당 HashMap을 써서 쓸 수 있다면 궁금합니다. 너는 어떤 생각을 가지고 있니? – Erol

+0

큰 해시 맵을로드하여 HashMap 이전의 공간을 예약하십시오. myMap = new HashMap (numberOfElements * 2) ;. 그렇게하지 않으면 LinkedHashMap으로 시도 할 수 있습니다. 내가 올바르게 기억한다면 나는 약간의 문제가 너무 컸고 LinkedHashMap deserial은 안드로이드에서 더 빠르다. (어떤 의미는 가지지 않지만 내 타이밍은 견고하다.) 당신은 그것을 시도 할 수도 있습니다 – weakwire

4

HashMap을 JSON 개체로 serialize 해 보았습니까? Android는 파일에서 JSON을 deserialize하는 데 꽤 좋은 지원을합니다.

+0

고맙습니다. 표준 직렬화에 대한 좋은 대안 인 것처럼 보입니다. 약 와이어의 솔루션으로 성공하지 못한다면 그것을 고려할 것입니다. – Erol