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?
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
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
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