2012-04-08 14 views
9

के बजाय LinkedHashMap को मैं कोड के इस स्निपेट है धर्मान्तरित जावा .lang.ClassCastException: java.util.LinkedHashMap com.tranca.bookstore.domain.shared.BaseObjectGSON मेरी वस्तु

में ढाला नहीं जा सकता

यहाँ है JSONObject वर्ग (मुझे द्वारा बनाई गई)

public class JSONObject<Entity> { 

private List<Entity> entities = new ArrayList<Entity>(); 
private long lastId = -1; 
public List<Entity> getEntities() { 
    return entities; 
} 
public void setEntities(List<Entity> entities) { 
    this.entities = entities; 
} 
public long getLastId() { 
    return lastId; 
} 
public void setLastId(long lastId) { 
    this.lastId = lastId; 
} 

public void incrementLastId() { 
    this.lastId++; 
} 

}

शायद आधार वस्तु प्रासंगिक है तो मैं कोड यहाँ डाल देंगे:

public abstract class BaseObject implements Serializable { 

protected long id = (long) -1; 
protected int version = 0; 

protected BaseObject(){} 

public long getId() { 
    return id; 
} 
public void setId(long id) { 
    this.id = id; 
} 
public int getVersion() { 
    return version; 
} 
public void setVersion(int version) { 
    this.version = version; 
} 

} 
+0

आप जीसन 2.1 का उपयोग कर रहे हैं? –

उत्तर

1

अंत में यह मिल गया!

समस्या यह थी कि:।

नई TypeToken < JSONObject < इकाई >>() {} GetType();

JSONObject < के प्रकार रिटर्न टी> नहीं उपवर्ग कि भंडार का विस्तार किया गया था की विशेष इकाई (जैसे UserRepository भंडार फैली < उपयोगकर्ता>)।

यह चाल उप-वर्गों को deserialization के प्रकार को सेट करने के लिए मजबूर करने के लिए एक सार विधि बनाने के लिए थी।

निष्कर्ष में यदि आपको यह त्रुटि मिलती है तो सुनिश्चित करें कि आपके पास सही प्रकार का वर्ग है (यदि आप सबक्लास का उपयोग करते हैं तो सुनिश्चित करें कि यह आपके उप-वर्ग को सुपरक्लास नहीं देता है)।

+6

क्षमा करें, मैं एक ही समस्या में भाग रहा हूं लेकिन मुझे आपका जवाब समझ में नहीं आया, क्या आप कृपया स्पष्टीकरण दे सकते हैं? धन्यवाद! –

+1

@ जोनाथन लिंग: अगर मैं सही ढंग से समझता हूं, तो समस्या यह है कि अभिव्यक्ति के प्रत्येक निष्पादन 'नया टाइप टोकन >() {} 'एक ही अज्ञात वर्ग का उदाहरण तत्काल कर रहा है। 'एंटिटी' वास्तव में एक वर्ग नहीं है, यह सिर्फ 'रिपोजिटरी' के लिए एक प्रकार-पैरामीटर है, इसलिए यह इस बिंदु पर पूरी तरह से मिटा दिया गया है, यहां तक ​​कि प्रतिबिंब के लिए वास्तव में भी सक्षम नहीं है। ('टाइपटेकन' सामान कक्षा पदानुक्रम को बाईपास करने के लिए प्रतिबिंब का उपयोग करने के लिए प्रतिबिंब का उपयोग करता है, लेकिन यह तब काम नहीं करता जब कक्षा स्वयं एक प्रकार पैरामीटर को संदर्भित करती है।) – ruakh

+1

क्षमा करें। फिर आपका जवाब स्पष्ट नहीं है। यदि आप एक सार्थक समाधान प्रदान कर सकते हैं तो यह अच्छा होगा। –

3

मुझे वही समस्या थी। एक अलग संदर्भ में एक और अधिक स्पष्ट जवाब देने के लिए:

मैं विधि जो त्रुटि "com.google.gson.internal.LinkedTreeMap MyType में ढाला नहीं जा सकता है" का उत्पादन निम्नलिखित था:

/** 
    * Reads a LinkedHashMap from the specified parcel. 
    * 
    * @param <TKey> 
    *   The type of the key. 
    * @param <TValue> 
    *   The type of the value. 
    * @param in 
    *   The in parcel. 
    * @return Returns an instance of linked hash map or null. 
    */ 
    public static <TKey, TValue> LinkedHashMap<TKey, TValue> readLinkedHashMap(Parcel in) { 
    Gson gson = JsonHelper.getGsonInstance(); 
    String content = in.readString(); 
    LinkedHashMap<TKey, TValue> result = gson.fromJson(content, new TypeToken<LinkedHashMap<TKey, TValue>>(){}.getType()); 
    return result; 
    } 

मैं चाहता था लिंक हैशप पढ़ने/लिखने का एक आसान सामान्य तरीका। उपर्युक्त समाधान काम नहीं करता है क्योंकि टीके के साथ टाइपोकोकन की प्रकार की जानकारी संकलन के बाद खोलेगी, जहां तक ​​मैं समझता हूं। और यह समस्या है। यदि आप बदलते हैं तो आप उदाहरण के लिए कोड हैं, तो यह काम करता है, क्योंकि अब हम स्पष्ट रूप से प्रकार टोकन को परिभाषित करते हैं। मैं जावा में इतना नहीं हूं कि मैं समझता हूं कि इस मामले में रनटाइम पर प्रकार की जानकारी को पढ़ना संभव क्यों है।

/** 
    * Reads a LinkedHashMap from the specified parcel. 
    * 
    * @param <TKey> 
    *   The type of the key. 
    * @param <TValue> 
    *   The type of the value. 
    * @param in 
    *   The in parcel. 
    * @return Returns an instance of linked hash map or null. 
    */ 
    public static <TKey, TValue> LinkedHashMap<TKey, TValue> readLinkedHashMap(Parcel in, TypeToken<LinkedHashMap<TKey, TValue>> typeToken) { 
    Gson gson = JsonHelper.getGsonInstance(); 
    Type type = typeToken.getType(); 
    String content = in.readString(); 
    LinkedHashMap<TKey, TValue> result = gson.fromJson(content, type); 
    return result; 
    } 

और अब आप की तरह ऊपर समारोह कहेंगे:

readLinkedHashMap(in, new TypeToken<LinkedHashMap<UUID, MyObject>>(){}); 

एक sidenote 1: जब से जुड़ा हुआ हैश नक्शा writign, आप बिल्कुल किसी भी प्रकार टोकन निर्दिष्ट करने की आवश्यकता नहीं है। toJson (मानचित्र) पर्याप्त है।

एक sidenote 2 (एक समस्या जो मेरे पास थी): डिफ़ॉल्ट जीएसएन कुंजी को क्रमबद्ध करने के लिए toString() का उपयोग करता है। यदि आप कुंजी प्रकार के लिए एक प्रकार एडाप्टर पंजीकृत करते हैं जो शायद अधिक जटिल प्रकार है, तो इस प्रकार एडाप्टर को क्रमबद्ध करते समय लागू नहीं किया जाता है, लेकिन जब deserializing। यह एक गैर संगत और इसलिए असफल प्रक्रिया की ओर जाता है। निम्नलिखित विकल्प complex map key serialization सक्रिय करता है।

gsonBuilder.enableComplexMapKeySerialization() 
+1

मुख्य रूप से यह 'gsonBuilder.enableComplexMapKeySerialization()' था जो मेरी समस्या को ठीक करता था – CrandellWS

संबंधित मुद्दे