我只是尝试使用多态来实现使用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\""
}
答案 0 :(得分:1)
不幸的是,在端点化/反序列化JSON时,云端点不会使用您的实际类。它使用生成的" flat" POJO类完全不知道您原始类中的任何层次结构。所以当你得到一个" Animal"在你的Android客户端上,我与其他类没有任何关系。
您唯一的希望是发送和指示对象的实际种类的附加参数,并在Android大小上手动组装相应的实例。