/** * Modify a map by deserializing it's values in place. Saves memory. * * @param map */ public void deserializeInPlace(Map map) { mapper.deserializeInPlace(map, this); }
/** * Try to deserialize map containing serialized object, e.g. having "__type" or "__t" key. Important. Is this * implementation can't deserialize the map, what usually means it has no known/properly serialized object in it, it * juts desearliazes it in place with {@link #deserializeInPlace(Map, BiDeserializer)} and return the same (but * updated) map instance. * * @param map possible containing the serialized object * @param <T> * * @return deserialized object or deserialized map */ public <T> T deserialize(Map map, BiDeserializer deserializer) { String typeName = (String) map.get("__type"); if (typeName == null) typeName = (String) map.get("__t"); if (typeName != null) { BiAdapter adapter = adapters.get(typeName); if (adapter != null) { return (T) adapter.deserialize(Binder.from(map), deserializer); } } deserializeInPlace(map, deserializer); return (T) map; }
/** * Update the map deserialziing it's values - e.g. in place. Saves memory but has strong side effects of discarding * source data. * * @param map to update * @param deserializer to use to deserialize map values */ public void deserializeInPlace(Map map, BiDeserializer deserializer) { map.forEach((key, value) -> { if (value instanceof Map) { String typeName = (String) ((Map) value).get("__type"); if (typeName == null) typeName = (String) ((Map) value).get("__t"); if (typeName == null) deserializeInPlace((Map) value, deserializer); else { BiAdapter adapter = adapters.get(typeName); if (adapter != null) { map.put(key, adapter.deserialize(Binder.from(value), deserializer)); } } } else if (value instanceof Collection) { map.put(key, ((Collection) value).stream() .map(x -> deserializer.deserialize(x)) .collect(Collectors.toList()) ); } }); }