当前位置: 首页 > 面试题库 >

更简单地使用TypeAdapterFactory

东郭和光
2023-03-14
问题内容

AFAIK可以通过进行最灵活的gson定制TypeAdapterFactory,但是它可能变得不必要地复杂。它迫使我为每个处理的类read和都编写代码write,而有时只需要一种方法。此外,有时JsonSerializer和/或JsonDeserializer更容易编写,例如在这里。这使我想到了以下问题:

  • 是否可以编写一个TypeAdapter仅委托其方法之一(例如,从写入ImmutableList到写入List)的a?
  • 是否可以以某种方式使用JsonSerializer和/或JsonDeserializer与它一起使用TypeAdapterFactory?另外,他们有工厂吗?

问题答案:

可以创建一个TypeAdapter委派其方法之一的方法。这个用例是API的重要组成部分,并且有一个getDelegateAdapter()方法用于此目的。通过this作为第一个参数getDelegateAdapter将返回,目前出厂后优先适配器

TypeAdapterFactory immutableListFactory = new TypeAdapterFactory() {
  @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
    if (!(type.getType() instanceof ParameterizedType)
        || !type.getRawType().equals(ImmutableList.class)) {
      return null;
    }

    ParameterizedType parameterizedType = (ParameterizedType) type.getType();
    TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
    TypeAdapter<?> elementAdapter = gson.getAdapter(
        TypeToken.get(parameterizedType.getActualTypeArguments()[0]));
    return new ImmutableListAdapter(delegate, elementAdapter);
  }

  class ImmutableListAdapter<E> extends TypeAdapter<ImmutableList<E>> {
    private TypeAdapter<List<E>> delegate;
    private TypeAdapter<E> element;

    ImmutableListAdapter(TypeAdapter<List<E>> delegate, TypeAdapter<E> element) {
      this.delegate = delegate;
      this.element = element;
    }

    @Override public void write(JsonWriter out, ImmutableList<E> value) throws IOException {
      delegate.write(out, value);
    }

    @Override public ImmutableList<E> read(JsonReader in) throws IOException {
      if (in.peek() == JsonToken.NULL) {
        in.nextNull();
        return null;
      }
      ImmutableList.Builder<E> builder = ImmutableList.builder();
      in.beginArray();
      while (in.hasNext()) {
        builder.add(element.read(in));
      }
      in.endArray();
      return builder.build();
    }
  }
};

您可以将JsonSerializer/
JsonDeserializer与混合搭配TypeAdapterFactory,但不能直接搭配。最简单的方法是回调Gson来序列化类中的子值。在此示例中,我们将内部循环更改为:

      while (in.hasNext()) {
        builder.add(gson.<E>fromJson(in, elementType));
      }

JsonSerializer/
JsonDeserializer和之间的主要区别TypeAdapter是从JSON到您的对象模型需要多少阶段。使用JsonSerializer/将JsonDeserializer对象首先转换为Gson的DOM模型(JsonElement等),然后再转换为您的对象模型。使用TypeAdapter,将跳过中间步骤。

这使类型适配器代码的读写变得有些棘手,因此您仅应将其用于优化代码。



 类似资料:
  • 我正在使用DynamoDB local进行单元测试。这并不坏,但也有一些缺点。明确地: 在测试运行之前,您必须以某种方式启动服务器 服务器在每次测试之前不会启动和停止,因此测试会变得相互依赖,除非在每次测试之后添加代码删除所有表等 所有开发者都需要安装它 我想做的是把DynamoDB本地jar和它所依赖的其他jar放在我的目录中(我用Java写)。然后在每次测试之前,我会启动它,用运行,测试结束后

  • 1. 前言 在上一节中,我们搭建了 MyBatis 实验环境。本小节,我们将一起学习如何使用 MyBatis,虽然在实际的开发中,你几乎不会按照本小节所介绍的方式去使用 MyBatis,但是这对你熟悉 MyBatis 整体结构有着重要作用,同时这也是面试的重点。 2. 编程式使用 MyBatis 官方文档中并未详细的介绍如何编程式使用 MyBatis,绝大多数情况下,我们都是通过 配置文件来拿到配

  • 一、脚本的理解 脚本本质就是多个终端命令的集合。 在工作中绝大多数机械重复性的工作其实都可以使用脚本来帮我们完成。 自动化更是是用来脚本来帮我们完成一些日常重复性的工作:比如每天下班的时候自动备份提交代码到远程仓库,就可以使用 Mac 的定时任务 + git 提交脚本 来实现。 二、脚本的基础知识 2.1、终端常用命令 2.2、可执行文件 可执行文件:Mac 上是指一般双击就可以使用终端执行的文件

  • 下载安装 Grafana也是用GO语言写的,无任何依赖,安装非常简单。 启动 sudo service grafana-server start 运行 直接访问:http://your_ip:3000 登入 默认帐号:admin 默认密码:admin 添加数据库 在Data Sources中添加数据库testDB 其中user和password,如果没有设置过,可以随便填下。 保存之后,可以通过

  • 通过输入起始点位置的GPS和终点位置的GPS,能够快速地在WebView中显示的谷歌地图上上画出轨迹路线(自驾、徒步、公交等)。并可获取到地理信息。 [Code4App.com]

  • 自定义地图上两点,绘制出两点直接的路径。使用MKPolyline绘制路径,支持长按(long press)地图自定义两点坐标。 作者说:参照http://code.google.com/p/ashiphone/downloads/detail?name=MapWithRoutes.zip