2010-05-23 34 views
5

Vì vậy, tôi muốn chuyển một LinkedHashMap đến một mục đích.serialize/deserialize một LinkedHashMap (android) java

//SEND THE MAP 
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class); 
singlechannel.putExtra("db",shows1);//perase to 
startActivity(singlechannel); 

//GET THE MAP 
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>(); 
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db"); 

Điều này hoạt động Như một nét duyên dáng với HashMap. Nhưng với LinkedHashMap tôi gặp vấn đề tôi gặp lỗi thời gian chạy ở đây

db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db"); 

Tôi không gặp lỗi với HashMap.

Tôi cũng nhận được cảnh báo "Loại an toàn: Bỏ chọn được chọn từ Serializable to LinkedHashMap" Nhưng tôi cũng có cảnh báo này với HashMap. Bất kỳ ý tưởng nào. Bất kỳ trợ giúp nào cũng được đánh giá cao

Ngoài ra tôi chỉ thấy điều này. https://issues.apache.org/jira/browse/HARMONY-6498

+0

hãy xem câu trả lời của tôi cho câu hỏi ban đầu để thay thế cho LinkedListHashMap – mdma

+0

AFAIK ... câu trả lời đó không liên quan đến câu hỏi này thực sự về các loại chung chung. –

+0

Bạn gặp phải lỗi thời gian chạy nào? Vui lòng bao gồm stacktrace. –

Trả lời

4

Gốc của sự cố ở đây là bạn đang cố gắng nhập truyền thành loại chung. Điều này không thể được thực hiện mà không có một loại bỏ không an toàn/bỏ chọn.

Loại thời gian chạy loại chung là loại thô; nghĩa là các loại trong đó các loại thông số loại thực tế không được biết. Trong trường hợp này, kiểu thời gian chạy sẽ là LinkedHashMap<?, ?>. Điều này không thể được nhập an toàn vào LinkedMashMap<String, String> vì hệ thống thời gian chạy không có cách nào để biết rằng tất cả các khóa và giá trị thực tế là String trường hợp.

Bạn có hai lựa chọn:

  • Bạn có thể thêm chú thích để cho trình biên dịch để "im lặng" về dàn diễn viên không được kiểm soát. Đây là một chút rủi ro. Nếu vì lý do nào đó, một trong các khóa hoặc giá trị không thực sự là Chuỗi, ứng dụng của bạn có thể sau đó nhận được ClassCastException ở một địa điểm hoàn toàn bất ngờ; ví dụ. trong khi lặp lại các phím hoặc gán kết quả của một get.

  • Bạn có thể sao chép theo cách thủ công Map<?, ?> vào một LinkedMashMap<String, String> mới, đúc rõ ràng từng khóa và giá trị cho String.

CẬP NHẬT

Rõ ràng nguyên nhân thực sự của ngoại lệ thời gian chạy (để phân biệt với các "thợ đúc chư không an toàn" lỗi biên dịch) là Android được đi qua các serializedExtra giữa ý đồ như một thường xuyên HashMap hơn là sử dụng lớp học Map mà bạn đã cung cấp. Điều này được mô tả ở đây:

Do đó Q & Giải thích, không có cách giải quyết đơn giản. Nếu bạn muốn vượt qua một bản đồ bảo quản thứ tự quan trọng, sẽ phải chuyển đổi bản đồ thành một mảng các cặp và chuyển nó. Ở đầu kia, bạn sẽ cần phải xây dựng lại bản đồ từ mảng đã truyền.

+0

cũng về chú thích nó cho trình biên dịch tắt nhưng không giải quyết được vấn đề. Tôi nhận được cảnh báo không phải là lỗi. Lỗi i có được trên thời gian chạy và không thể thực sự hiểu tại sao. Đó là một ngoại lệ trong utils.LinkedHashMap.java Câu trả lời thứ hai không giải quyết được vấn đề một lần nữa. Vấn đề là LinkedHashMap không thể được tuần tự hóa vì lý do nào đó Nhưng công ty rất nhiều cho câu trả lời của bạn và thời gian bạn đã viết để viết nó – weakwire

+1

Câu hỏi của bạn là về cảnh báo trình biên dịch và câu trả lời của tôi cho bạn biết 2 cách để xử lý cảnh báo trình biên dịch đó . Nếu bạn C ALNG nhận được lỗi thời gian chạy, bạn nên nói như vậy trong câu hỏi ... và bạn cũng nên cung cấp dấu vết ngăn xếp. Không giống như Jon Skeet, tôi không thể đọc được suy nghĩ của bạn. –

+0

Tôi rất xin lỗi. Bạn đang đúng Tôi đang tìm kiếm này quá lâu now.Sorry một lần nữa tôi chỉ cần chỉnh sửa bài viết đầu tiên của tôi – weakwire

2

LinkedHashMap không thực hiện Bản đồ giao diện, đây là định nghĩa từ mã nguồn:

public class LinkedHashMap<K,V> 
    extends HashMap<K,V> 
    implements Map<K,V> 

Các thử nghiệm sau đây đang làm việc tốt, vì vậy tôi nghĩ rằng vấn đề bạn có được không liên quan LinkedHashMap.

Map<String, String> map = new LinkedHashMap<String, String>(); 
     map.put("1", "one"); 
     FileOutputStream fos = new FileOutputStream("c://map.ser"); 
     ObjectOutputStream out = new ObjectOutputStream(fos); 
     out.writeObject(map); 
     out.close(); 


     FileInputStream fin = new FileInputStream("c://map.ser"); 
     ObjectInputStream in = new ObjectInputStream(fin); 
     Map<String, String> map2 = (Map<String, String>) in.readObject(); 
     System.out.println(map2); 
+0

dường như nó không có trong một số phiên bản của Harmony. (Đó là một lỗi, tất nhiên.) –

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