我只是尝试使用objectify创建具有层次结构的类的实体的多态性。例如,我有一个名为Animal的基本实体,并且有名为Mammal和Reptile的子类,这也是entities。
当我尝试存储和检索数据时,它工作得很好,我可以将基本的Animal类转换为哺乳动物或爬行动物。
但是,当我尝试在google cloud端点中返回一个动物列表时,这种继承不会被保留。我无法在客户端将Animal类转换为哺乳动物或爬行动物。
实际上,google cloud端点正在创建另一个模型类型,该模型类型实际上是在端点中作为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;我将返回该动物对象,它可能是一个Mammal实例,我应该根据客户端中的实例将其转换为Mammal或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\""
}发布于 2015-05-24 22:57:57
不幸的是,云端点在序列化/反序列化JSON时并不使用实际的类。它使用一个生成的“扁平”POJO类,这个类完全不知道原始类中的任何层次结构。所以当你在你的Android客户端上得到一个"Animal“类的时候,我和其他类一点关系都没有。
你唯一的希望就是发送额外的参数来指示对象的实际类型,并根据Android的大小手动组装相应的实例。
https://stackoverflow.com/questions/30415484
复制相似问题