gpt4 book ai didi

java - 具有 Gson 序列化的 RealmObjects 的继承组合

转载 作者:搜寻专家 更新时间:2023-11-01 08:28:52 24 4
gpt4 key购买 nike

出于各种原因,我正在考虑将 Realm 作为数据库解决方案,但目前最重要的是 TransactionTooLargeException 现在被扔进 Nougat 中,所以我必须基于 ActiveAndroid 重新设计我当前的数据库架构,它有自己的烦人的限制。困难在于 Realm 不支持继承 (https://github.com/realm/realm-java/issues/761),而且他们似乎并不急于解决它。相反,他们建议使用组合而不是继承,但我不知道如何使用 Gson/Json 反序列化来实现这一点。

例子:

父类(super class):动物,有狗和德国牧羊犬的子类

public class Animal {

private int numLegs;

private boolean hasFur;
}

public class Dog extends Animal {
private String color;

private boolean canDoTricks;
}

public class GermanShepherd extends Dog {

public boolean isGuardDog;

public boolean isAtRiskOfHipDysplasia()
}

(抱歉,这是一个 super jar 装示例,只是为了说明)。

现在假设这个 json 看起来像:

{
"numLegs" : 4,
"hasFur" : true,
"color" : "Black & Brown",
"canDoTricks" : true,
"isGuardDog" : true,
"isAtRiskofHipDysplasia" : false
}

现在,我不能修改 Json,因为它是给我的 API。

看看这个答案: https://stackoverflow.com/a/41552457/4560689 ,似乎有可能以一种非常 hacky 的方式让它工作,但答案指出存在一些限制,包括序列化是错误的。由于服务器仅以不涉及疯狂组合的 json 格式进行通信,因此出现了问题。

我可以编写自定义 Gson 反序列化器/序列化器来完成这项工作吗?如果是这样,那会是什么样子?我基本上需要能够将 json 负载转换为最多 N 个对象,其中 N - 1 个对象嵌套在基础对象中。

所以对于组合(注意这不一定是“Realm ”组合,只是一个例子,因为它看起来像 Realm 必须使用一些奇怪的接口(interface)组合形式),我有一个如下所示的类:

public class GermanShepherd {
public Animal animal;
public Dog dog;

// Generate a bunch of delegate methods here
}

我是不是找错了树?感觉 Realm 可能不适用于我正在尝试做的事情,并且继承已内置到我在多个地方使用的 API 中,特别是在我想要保留的对象中,所以我必须想出一个解决方法或使用其他解决方案。 ActiveAndroid(我现在正在使用的)也是一个不太理想的解决方案,我厌倦了处理绕过死锁、崩溃、查询后台线程,如果数据太大而无法传递,现在会导致崩溃 Intent 等...SQLite 的所有问题。我对解决我的主要问题或解决此问题的替代方案持开放态度。预先感谢您的帮助!

最佳答案

您应该为每个扁平化的具体类创建一个新的 RealmObject 类,并将您的 JSON 表示映射到它们。

要保留继承,您可以通过从相互继承的接口(interface)继承 getter/setter 来模拟它。

public interface IAnimal extends RealmModel {    
int getNumberOfLegs();
void setNumberOfLegs(int legs);
boolean getHasFur();
void setHasFur(boolean hasFur);
}

public interface IDog extends IAnimal {
String getColor();
void setColor(String color);
boolean getCanDoTricks();
void setCanDoTricks();
}

public interface IGermanShepherd extends IDog {
boolean getIsGuardDog();
void setIsGuardDog(boolean isGuardDog);
boolean getIsAtRiskOfHipDysplasia();
void setIsAtRiskOfHipDysplasia(boolean isAtRisk);
}

因为那时你可以做

public class GermanShepard 
extends RealmObject
implements IGermanShepard {
private int numLegs;
private boolean hasFur;
private String color;
private boolean canDoTricks;
private boolean isGuardDog;
private boolean isAtRiskofHipDysplasia;

// inherited getters/setters
}

您甚至可以从中创建存储库类

public abstract class AnimalRepository<T extends IAnimal> {
protected Class<T> clazz;

public AnimalRepository(Class<T> clazz) {
this.clazz = clazz;
}

public RealmResults<T> findAll(Realm realm) {
return realm.where(clazz).findAll();
}
}

@Singleton
public class GermanShepardRepository extends AnimalRepository<GermanShepard> {
@Inject
public GermanShepardRepository() {
super(GermanShepard.class);
}
}

然后

@Inject
GermanShepardRepository germanShepardRepository;

RealmResults<GermanShepard> results = germanShepardRepository.findAll(realm);

但你确实可以将它们合并为一个类,然后给它一个String type; 参数就可以知道它原来是什么类型。这可能比拥有所有这些德国牧羊犬还要好。

关于java - 具有 Gson 序列化的 RealmObjects 的继承组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42259735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com