有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaGSON图形适配器和运行时适配器

我的第一个问题,如果我遗漏了什么,请告诉我=)

我一直在做一个项目,这个管道被传递给我,它基于Gson编码/解码通过模块传递消息

在某个时候,我需要序列化多态类并确保正确解码它们,然后我找到了RuntimeTypeAdapterFactory,这非常有效

具体案例是这样的:

public class Tree {
  Node root;
}

public class Node {
  List<Node> nodeChildren;
}

public class Token extends Node {}

基本上Tree有一个根,可以是NodeToken,树中的节点可以是Nodes或实际的Tokens

执行Gson en/解码时,以下代码将执行此操作:

RuntimeTypeAdapterFactory<Node> nodeAdapter = new RuntimeTypeAdapterFactory<Node>(Node.class);
nodeAdapter.registerSubtype(Token.class);
nodeAdapter.registerSubtype(Node.class);
Gson gson = new GsonBuilder().(..).registerTypeAdapterFactory(nodeAdapter).create();

然后,最近,我发现我需要在我的Trees的叶Tokens中使用循环引用。原来Gson不支持循环,但是还有一个适配器:GraphAdapterBuilder。根据测试类,它似乎完全实现了我想要的功能。问题是我找不到把它们结合起来的方法。我想这样的事情可以做到:

RuntimeTypeAdapterFactory<Node> nodeAdapter = new RuntimeTypeAdapterFactory<Node>(Node.class);
nodeAdapter.registerSubtype(Token.class);
nodeAdapter.registerSubtype(Node.class);
GsonBuilder builder = new GsonBuilder().(..).registerTypeAdapterFactory(nodeAdapter);
GraphAdapterBuilder graphBuilder = new GraphAdapterBuilder();
graphBuilder.addType(Token.class);
graphBuilder.registerOn(builder);
Gson gson = builder.create();

我在解码时得到异常java.lang.IllegalStateException: Not a JSON Object: "0x2"。如果我只在调用registerOn(builder)之后注册RuntimeFactory,也会发生同样的情况。这意味着在GraphBuilder使用0x?ID之前,我正在RuntimeFactory上进行委托

如果我完全删除了RuntimeFactory,基于图形可以满足运行时对象创建的假设,我在解码时会得到另一个异常java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING,这可能意味着我没有委托GraphBuilder来使用0x?id

我几乎尝试了注册和构建器/适配器的每一种组合,除了预期的行为之外,结果总是不同的。其他组合的其他例外包括java.lang.IllegalStateException: Unexpected recursive call to read() for 0x2JsonParseException: cannot deserialize Token because it does not define a field named type(这一个我注意到RuntimeFactory只应用于GraphBuilder发现的递归Tokens,而不应用于我拥有的Token的其他实例

现在,我从这个组合中所期望的是:Gson找到Token并委托给GraphFactory,这将添加id 0x?,然后委托给RuntimeFactory,这将添加type,然后再次委托给Gson,用于其余字段。但我似乎无法让工厂正确地执行这项任务。我是不是遗漏了什么,或者说我唯一能做到这一点的方法就是自己把这两种产品混入同一家工厂

提前谢谢


共 (0) 个答案