首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将具体类型的对象反序列化为接口类型

将具体类型的对象反序列化为接口类型
EN

Stack Overflow用户
提问于 2016-02-15 19:18:38
回答 2查看 641关注 0票数 0

我有一个名为"Clerk“的具体类,它实现了一个名为"Worker”的接口。我想反序列化我的Clerk对象,并将它存储到Worker对象中,就像我们通常可以这样做的那样:

代码语言:javascript
复制
Worker clerkWorker = new Clerk("abc", "alice white");

相反,我有一个要反序列化并存储到clerkWorker中的办事员json:

代码语言:javascript
复制
{
  "uid": "1a-2wq"
  "name": "Maryanne Chen"
}

接口:

代码语言:javascript
复制
public interface Worker {
  int getUID();
  String getName();
  void work();
}

实现它的类:

代码语言:javascript
复制
private class Clerk implements Worker {
  int uid;
  String name;

  public Clerk(id, fullname) {
    uid = id;
    name = fullname;
  }

  public void work() {
    System.out.println("Clerk is processing files");
  }
}

按照这里描述的第二个解决方案:Using Gson with Interface Types,我在本地复制了RuntimeTypeAdapterFactory以使用它:

代码语言:javascript
复制
RuntimeTypeAdapterFactory typeFactory =     
RuntimeTypeAdapterFactory.of(Worker.class, "type");
typeFactory.registerSubtype(Clerk.class);
Gson gson = new GsonBuilder().registerTypeAdapterFactory(typeFactory).create();

final Reader r = getReader(jsonFile);
return gson.fromJson(r, typeToken.getType());

我已经验证了我的getReader函数是有效的。我有个例外:

“无法反序列化接口工作者,因为它没有定义名为type的字段”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-15 23:04:26

如果Clerk是一个Worker,那么就不应该有任何理由不能完全按照构造函数示例显示的那样做。

代码语言:javascript
复制
Worker w = (new Gson()).fromJson( jsonData, Clerk.class ) ;

我不知道你为什么要这么快地往上投,因为任何想要Worker的东西都应该可以直接使用Clerk .

票数 1
EN

Stack Overflow用户

发布于 2016-02-15 20:25:20

当您告诉Gson用接口类型反序列化某个东西时,它必须以某种方式确定它应该使用哪个实现类。它通过检查json数据中的一个特殊字段来做到这一点。当您调用RuntimeTypeAdapterFactory.of(Worker.class, "type");时,您正在告诉Gson,它应该检查的字段应该使用哪个类来命名为"type“。然后,当您给它一个没有该字段的json数据块时,它会发出抱怨。

要解决这个问题,您需要将"type“字段添加到json数据中,或者告诉代码中的Gson反序列化为Clerk,而不是Worker

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35417361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档