反序列化以在运行时键入 [英] Deserialize to type at runtime

查看:100
本文介绍了反序列化以在运行时键入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用 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

实现TypeAdapterFactory {
@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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆