Привет! Есть у меня вот такой класс:
public class Node<T> implements Serializable {
private final String name;
private final T value;
private final String type;
public Node(String name, T value, String type) {
this.name = name;
this.value = value;
this.type = type;
}
}
Мне необходима возможность сериализовывать/дессериализовывать в JSON его. При этом T - может быть любой, в том числе и List<E>, Map<K, V> и и.д
Я сделал вот так:
public class NodeMarshaller {
private final Gson gson;
NodeMarshalle() {
this.gson = new Gson();
}
public String serialize(Node<?> node) {
return gson.toJson(node);
}
public Node<?> deserialize(String node) {
try {
Class<?> clazz = Class.forName(new JsonParser().parse(node).getAsJsonObject().get("type").getAsString());
return gson.fromJson(node, getType(Node.class, clazz));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
private Type getType(Class<?> rawClass, Class<?> parameter) {
return new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return new Type[]{parameter};
}
@Override
public Type getRawType() {
return rawClass;
}
@Override
public Type getOwnerType() {
return null;
}
};
}
}
Я использую библиотеку GSON, но в принципе - не важно, могу перейти на любую.