2012-05-16 35 views
5

Tôi serializing một HashMap trên ứng dụng máy tính của tôi sử dụng đoạn mã sau:vấn đề Deserialization HashMap trong Android

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

Sau đó, tôi đang de-serializing nó trong ứng dụng Android của tôi với mã này:

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

Cuối cùng, tôi đang đối mặt với hai vấn đề.

1) Quá trình Deserialization mất một thời gian rất dài. Nó chứa khoảng hàng ngàn khóa sao cho nó bình thường? Có một phương pháp serialization hiệu quả hơn để giải quyết điều đó không?

2) Sau khi deserialization, tôi nhận được một hashmap chiếm gần gấp đôi kích thước nó ban đầu chiếm trên VM và khi tôi kiểm tra nó trong trình gỡ lỗi, nó có rất nhiều mục null giữa các giá trị khóa ban đầu nó chứa. Tuy nhiên, chúng không phải là các khóa rỗng mà chỉ là null và tôi không thể xem bên trong chúng là gì. Tôi gỡ lỗi trong Eclipse. Tại sao nó lại xảy ra?

Trả lời

3

1) Kích thước cho HashMap "bình thường" trong kích thước VM là bao nhiêu? Tôi không nghĩ rằng đó là một giải pháp khác (nếu có ai đó cho chúng tôi thấy) cho vấn đề đó. Bạn có thể thử chia sẻ một sqlite hoặc một cái gì đó. Nếu bạn muốn colaborate những gì bạn đang cố gắng giải quyết chúng ta có thể đề xuất kỹ thuật mà làm cho công việc nhanh hơn

Cập nhật

Bạn có thể thử khởi Map lúc init, như bạn đề nghị, với công suất lớn nếu bạn biết kích thước HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>(SIZE*2);

cho 2. từ here

Một thể hiện của HashMap có hai thông số ảnh hưởng đến hiệu quả của nó: công suất ban đầu và fac tải tor. Dung lượng là số lượng các nhóm trong bảng băm và công suất ban đầu chỉ đơn giản là dung lượng tại thời điểm bảng băm được tạo ra. Hệ số tải là thước đo mức độ đầy đủ của bảng băm được phép nhận trước khi dung lượng của nó được tự động tăng lên. Khi số lượng mục nhập trong bảng băm vượt quá sản phẩm của hệ số tải và công suất hiện tại, công suất được tăng gấp đôi bằng cách gọi phương thức rehash

+0

Cảm ơn bạn, điều này thực sự hữu ích. Tôi không bao giờ biết tôi có thể chơi với các thông số HashMap. Việc chỉ định hệ số tải và dung lượng trong quá trình khởi tạo sẽ giúp ích cho nó. – Erol

+0

Tôi đã tự hỏi, nếu tôi có thể tạo một HashMap trước khi deserialization và có phương pháp readObject sử dụng HashMap cụ thể để ghi vào. Bạn còn ý kiến ​​nào không? – Erol

+0

thử tải một hashMap lớn để bạn đã đặt trước không gian từ trước HashMap myMap = new HashMap (numberOfElements * 2) ;. Nếu điều đó không làm cho nó, bạn có thể thử làm điều đó với LinkedHashMap. Nếu tôi nhớ chính xác tôi đã có một số vấn đề quá và LinkedHashMap deserial là nhanh hơn trong Android (không có ý nghĩa gì nhưng thời gian của tôi là rắn). Bạn có thể thử điều đó cũng như – weakwire

4

Bạn đã thử serializing HashMap vào một đối tượng JSON? Android có hỗ trợ khá tốt cho việc deserializing JSON từ một tệp.

+0

Cảm ơn bạn. Nó trông giống như một thay thế tốt đẹp cho serialization tiêu chuẩn. Tôi sẽ xem xét nó nếu tôi sẽ không thành công với giải pháp của weakwire. – Erol

Các vấn đề liên quan