मेरी टाइप मिस्चैच समस्या को हल करने के लिए in this thread पर चर्चा की गई मैंने कस्टम Deserializers
बनाया और उन्हें ObjectMapper
पर जोड़ा। हालांकि प्रदर्शन इसके साथ काफी खराब हो जाता है।कस्टम deserializer के साथ जैक्सन deserializing बहुत सारे जीसी कॉल का कारण बनता है और बहुत अधिक समय लेता है
डिफ़ॉल्ट deserializer के साथ मुझे logcat
में 1-2 कचरा संग्रहण कॉल मिलती है जबकि कस्टम deserializer के साथ कम से कम 7-8 जीसी कॉल हैं, और इसलिए प्रसंस्करण समय भी काफी बढ़ता है।
मेरे deserializer:
public class Deserializer<T> {
public JsonDeserializer<T> getDeserializer(final Class<T> cls) {
return new JsonDeserializer<T>(){
@Override
public T deserialize(JsonParser jp, DeserializationContext arg1) throws IOException, JsonProcessingException {
JsonNode node = jp.readValueAsTree();
if (node.isObject()) {
return new ObjectMapper().convertValue(node, cls);
}
return null;
}
};
}
}
और मैं
public class DeserializerAttachedMapper<T> {
public ObjectMapper getMapperAttachedWith(final Class<T> cls , JsonDeserializer<T> deserializer) {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule(deserializer.toString(), new Version(1, 0, 0, null, null, null));
module.addDeserializer(cls, deserializer);
mapper.registerModule(module);
return mapper;
}
}
संपादित मैपर में जोड़ने के लिए इस का उपयोग कर रहा: जोड़ी अतिरिक्त डेटा
मेरे JSON काफी आकार, लेकिन इसे भरपूर नहीं की है : मैंने it here
चिपकाया हैअब एक ही JSON को पार्स अगर मैं इस कोड का उपयोग करने के लिए:
String response = ConnectionManager.doGet(mAuthType, url, authToken);
FLog.d("location object response" + response);
// SimpleModule module = new SimpleModule("UserModule", new Version(1, 0, 0, null, null, null));
// JsonDeserializer<User> userDeserializer = new Deserializer<User>().getDeserializer(User.class);
// module.addDeserializer(User.class, userDeserializer);
ObjectMapper mapper = new ObjectMapper();
// mapper.registerModule(module);
JsonNode tree = mapper.readTree(response);
Integer code = Integer.parseInt(tree.get("code").asText().trim());
if(Constants.API_RESPONSE_SUCCESS_CODE == code) {
ExploreLocationObject locationObject = mapper.convertValue(tree.path("response").get("locationObject"), ExploreLocationObject.class);
FLog.d("locationObject" + locationObject);
FLog.d("locationObject events" + locationObject.getEvents().size());
return locationObject;
}
return null;
तब मेरे logcat like this
है लेकिन अगर मैं एक ही JSON के लिए इस कोड का उपयोग
String response = ConnectionManager.doGet(mAuthType, url, authToken);
FLog.d("location object response" + response);
SimpleModule module = new SimpleModule("UserModule", new Version(1, 0, 0, null, null, null));
JsonDeserializer<User> userDeserializer = new Deserializer<User>().getDeserializer(User.class);
module.addDeserializer(User.class, userDeserializer);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
JsonNode tree = mapper.readTree(response);
Integer code = Integer.parseInt(tree.get("code").asText().trim());
if(Constants.API_RESPONSE_SUCCESS_CODE == code) {
ExploreLocationObject locationObject = mapper.convertValue(tree.path("response").get("locationObject"), ExploreLocationObject.class);
FLog.d("locationObject" + locationObject);
FLog.d("locationObject events" + locationObject.getEvents().size());
return locationObject;
}
return null;
तब मेरे logcat है like this
एक अतिरिक्त टिप्पणी: पूरी तरह से सुनिश्चित आप पुन: उपयोग कर 'ObjectMapper' - यह एक भारी वजन वस्तु है और अनुरोध के अनुसार एक बार नहीं बनाया जाना चाहिए। अन्यथा यह निश्चित रूप से बहुत सी जीसी गतिविधि का कारण बन सकता है। उपर्युक्त कोड से निश्चित रूप से जानना मुश्किल है। – StaxMan
असल में मैंने देखा कि आपका deserializer एक ऑब्जेक्टमैपर बनाता है: यह बहुत महंगा है। आप 'जेसन पार्सर' का उपयोग करके इससे बच सकते हैं।getCodec() ', कास्टिंग परिणाम 'ऑब्जेक्टमैपर' (जो सुरक्षित अपस्टास्ट है)। इससे काफी मदद मिलनी चाहिए। – StaxMan
मैंने अपने कोड को संशोधित किया और ऑब्जेक्ट मैपर को मेरे सिंगलटन में जोड़ा, प्रदर्शन डिफ़ॉल्ट डिसेराइज़र के लिए बेहतर हुआ लेकिन कस्टम deserializer के साथ समस्या अभी भी वहाँ है। साथ ही, मैंने देखा कि यदि मैं एक ही मॉड्यूल में दो deserializers जोड़ता हूं तो डिफ़ॉल्ट deserializer कस्टम एक नहीं कहा जाता है। 'JsonParser.getCodec() 'एक स्थिर विधि नहीं है, इसलिए मुझे प्रत्येक अनुरोध के लिए' JsonParser' बनाना होगा। क्या वह महंगा भी नहीं होगा ?? – vKashyap