反序列化以在运行时键入

编程入门 行业动态 更新时间:2024-10-28 08:26:10
本文介绍了反序列化以在运行时键入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

更多推荐

反序列化以在运行时键入

本文发布于:2023-11-09 20:09:40,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:序列化

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!