反序列化以在运行时键入 [英] Deserialize to type at runtime
问题描述
我试图使用 TypeAdapterFactory
来序列化和反序列化一些客户对象。我想在运行时将所有对象序列化为一个特定的类型。
所以给定一个 String classpath
和一个 JsonObject对象
我想将对象反序列化为 Class.forName(classpath)
的实例。
public< T> TypeAdapter< T> create(final Gson gson,final TypeToken< T> tokenType)
{
final TypeAdapter< T> delegate = gson.getDelegateAdapter(this,tokenType);
final TypeAdapter< JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
返回新的TypeAdapter< T>()
{
@Override
public T read(JsonReader reader)抛出IOException
{
Class< ;?> clazz = Class.forName(classpath);
JsonObject jsonObject = elementAdapter.read(reader).getAsJsonObject();
//这里我想返回一个clazz实例
$ b @Override
public void write(JsonWriter writer,T value)throws IOException
{
}
};
}
我会怎么做?
<您可以尝试这样的事情(代码不会编译,您需要捕获异常)。解决方案您可以尝试这样的事情(代码不会编译,您需要捕获异常)。也许有更好的语法 THIS
。
@Override
public< T> TypeAdapter< T> create(final Gson gson,final TypeToken< T> tokenType){
final MyClass THIS = this;
返回新的TypeAdapter< T>(){
@Override
public T read(JsonReader reader)throws IOException {
Class<?> clazz = Class.forName(classpath);
TypeToken< T> token =(TypeToken< T>)TypeToken.get(clazz);
TypeAdapter< T> adapter = gson.getDelegateAdapter(THIS,token);
JsonElement tree = gson.getAdapter(JsonElement.class).read(reader);
T out = adapter.fromJsonTree(tree);
退出;
}
@Override
public void write(JsonWriter writer,T value)throws IOException {
}
};
}
}
I am trying to use TypeAdapterFactory
to serialize and deserialize some customer objects. I would like to serialize all the objects to a particular type at runtime.
So given a String classpath
and a JsonObject object
I would like to deserialize the object to an instance of Class.forName(classpath)
.
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType)
{
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, tokenType);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
return new TypeAdapter<T>()
{
@Override
public T read(JsonReader reader) throws IOException
{
Class<?> clazz = Class.forName(classpath);
JsonObject jsonObject = elementAdapter.read(reader).getAsJsonObject();
// Here I want to return an instance of clazz
}
@Override
public void write(JsonWriter writer, T value) throws IOException
{
}
};
}
How would I go about this?
You can try something like this (code wont compile, you need to catch exceptions). Maybe there is a better syntax for THIS
too.
final class MyClass implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType) {
final MyClass THIS = this;
return new TypeAdapter<T>() {
@Override
public T read(JsonReader reader) throws IOException {
Class<?> clazz = Class.forName(classpath);
TypeToken<T> token = (TypeToken<T>) TypeToken.get(clazz);
TypeAdapter<T> adapter = gson.getDelegateAdapter(THIS, token);
JsonElement tree = gson.getAdapter(JsonElement.class).read(reader);
T out = adapter.fromJsonTree(tree);
return out;
}
@Override
public void write(JsonWriter writer, T value) throws IOException {
}
};
}
}
这篇关于反序列化以在运行时键入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!