从谷歌云端点返回多态对象

时间:2015-05-23 17:12:45

标签: java google-app-engine google-cloud-endpoints objectify

我只是尝试使用多态来实现使用objectify创建具有层次结构的类。例如,我有一个名为Animal的基本实体,并且有一个名为Mammal和Reptile的子类,它们也是实体 当我尝试存储数据并检索它时,它的工作正常,我可以从基础Animal类转换为Mammal或Reptile。

但是当我尝试在谷歌云端点返回动物列表时,这种继承不会被保留。我无法在客户端从Animal类转换为Mammal或Reptile。

实际上,谷歌云端点正在创建另一种模型类型,它实际上在端点中作为JSON返回,与我们的实体不同,并且继承不会保留在这些模型类中。

基本上我需要根据对象的类型查询所有动物和客户端是否其Mammal或Reptile i将相应地显示UI。

以下是示例代码

我有两个类Animal和Mammal。而哺乳动物是动物的子类。

Animal annie = new Animal();
annie.name = "Annnnn";
ofy().save().entity(annie).now();

Mammal mam = new Mammal();
mam.name = "Mammmaaaal";
mam.longHair = true;
ofy().save().entity(mam).now();

// This will return the Cat
Animal fetched = ofy().load().type(Animal.class).id(mam.id).now();
return Animal;

我将返回可能是Mammal实例的动物对象,我应该根据客户端的实例将其转换为Mammal或Animal的任何其他子类。

是否有人对此问题有任何解决方案或解决方法?

以下是检索动物清单的json响应。但我无法在Android客户端将动物对象转换为Mammal。

{
 "items": [      
  {
   "id": "5631986051842048",
   "name": "mammm",
   "longHair": true,
   "kind": "animalApi#resourcesItem"
  },
  {
   "id": "5697423099822080",
   "name": "Animalll",
   "kind": "animalApi#resourcesItem"
  }
 ],
 "nextPageToken":     "CjwSNmofc35tb3ZpZWFkZGljdC12Mi1kZWJ1Zy1jb2RlaGFyZHITCxIGQW5pbWFsGICAgIDruI8KDBgAIAA",
 "kind": "animalApi#resources",
 "etag": "\"cZTcM4l5N_SjrKcEhGkKJEl9rU4/rs8BjIS52gHgN0B1UGEEi2DERwE\""
}

1 个答案:

答案 0 :(得分:1)

不幸的是,在端点化/反序列化JSON时,云端点不会使用您的实际类。它使用生成的" flat" POJO类完全不知道您原始类中的任何层次结构。所以当你得到一个" Animal"在你的Android客户端上,我与其他类没有任何关系。

您唯一的希望是发送和指示对象的实际种类的附加参数,并在Android大小上手动组装相应的实例。