Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从google云端点返回多态对象_Java_Google App Engine_Google Cloud Endpoints_Objectify - Fatal编程技术网

Java 从google云端点返回多态对象

Java 从google云端点返回多态对象,java,google-app-engine,google-cloud-endpoints,objectify,Java,Google App Engine,Google Cloud Endpoints,Objectify,我只是尝试对实体使用多态性,以便使用objectify创建具有层次结构的类。例如,我有一个名为Animal的基本实体,并且有这个命名的哺乳动物和爬行动物的子类,它们也是实体。 当我尝试存储和检索数据时,它工作正常,我可以从基本动物类转换为哺乳动物或爬行动物类 但当我试图返回谷歌云端点中的动物列表时,这种继承并没有得到保留。在客户端,我无法从动物类转换为哺乳动物或爬行动物 { "items": [ { "id": "5631986051842048", "name":

我只是尝试对实体使用多态性,以便使用objectify创建具有层次结构的类。例如,我有一个名为Animal的基本实体,并且有这个命名的哺乳动物和爬行动物的子类,它们也是实体。
当我尝试存储和检索数据时,它工作正常,我可以从基本动物类转换为哺乳动物或爬行动物类

但当我试图返回谷歌云端点中的动物列表时,这种继承并没有得到保留。在客户端,我无法从动物类转换为哺乳动物或爬行动物

{
 "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\""
}
实际上,googlecloudendpoint正在创建另一个模型类型,它在端点中实际返回为JSON,与我们的实体不同,并且这些模型类中不保留继承

基本上,我需要查询所有的动物,在客户端,根据对象的类型,无论是哺乳动物还是爬行动物,我都会相应地显示UI

这是一个示例代码

我有两类动物和哺乳动物。哺乳动物是动物的一个亚类

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;
我将返回那个动物对象,它可能是一个哺乳动物实例,我应该根据它在客户端的实例将它转换为哺乳动物或动物的任何其他子类

有人有解决这个问题的方法吗

下面是检索动物列表的json响应。但我无法在android客户端将动物对象转换为哺乳动物

{
 "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\""
}

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


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

你能用更多关于JSON的细节来说明你到目前为止做了什么吗?@polarysekt:我用一些代码更新了这个问题。我正在尝试扩展思考过程。让我试着猜猜你想做什么。是否要使用基类指针访问派生类的成员功能?[JSON文本会有帮助]@polarysekt:是的,我想用基指针访问派生类成员,但在客户端。你有我可以参考的链接吗?你能发布你得到的JSON和你期望的吗?有可能为云端点编写自定义反序列化程序吗?云端点api是否允许我们自定义反序列化行为?AFAIK无法自定义该逻辑。我们确实为转换提供了有限的功能。具体请参见
@ApiResourceProperty
@ApiTransformer