【发布时间】:2017-01-08 01:18:31
【问题描述】:
我在我的项目中使用 Retrofit、Gson 和 Realm。
我有这门课Example需要Serializable。如果没有 Realm,我会这样写:
public class Example implements Serializable {
@SerializationName("users")
private List<String> users
//... getters and setters
}
Realm 开始发挥作用,Example 变为(请注意,出于兼容性原因,getter 和 setter 采用这种方式):
public class Example extends RealmObject implement Serializable {
@SerializedName("users")
private RealmList<RealmString> users;
public ArrayList<String> getUsers() {
ArrayList<String> array = new ArrayList<>();
for (RealmString rs : users) {
array.add(rs.getValue());
}
return array;
}
public void setUsers(ArrayList<String> users) {
RealmList<RealmString> array = new RealmList<>();
for (String rs : users) {
array.add(new RealmString(rs));
}
this.users = array;
}
}
RealmString 是:
public class RealmString extends RealmObject implements Serializable {
private String val;
//Constructors, getter and setter
}
并添加一个自定义的 Gson 类型转换器以使其正确反序列化:
public class RealmStringRealmListConverter implements JsonSerializer<RealmList<RealmString>>,
JsonDeserializer<RealmList<RealmString>> {
@Override
public JsonElement serialize(RealmList<RealmString> src, Type typeOfSrc,
JsonSerializationContext context) {
JsonArray ja = new JsonArray();
for (RealmString tag : src) {
ja.add(tag.getValue());
}
return ja;
}
@Override
public RealmList<RealmString> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
RealmList<RealmString> tags = new RealmList<>();
JsonArray ja = json.getAsJsonArray();
for (JsonElement je : ja) {
if (je.isJsonPrimitive()) {
tags.add(new RealmString(je.getAsString()));
}
}
return tags;
}
}
好的,现在我们开始感觉到 Realm 开始对我们的代码产生很大的影响。但这是一个附带问题,主要问题是 Example 不再是 Serializable :RealmList 不是。
所以我尝试将 RealmList 设为瞬态并拥有可以使用 @Ignore 注释的挂起列表,并在序列化后重新创建 RealmList。但是 Realm 不接受瞬态。
现在我感觉有点卡住了,Example 在我的代码的许多部分(它是很多类的成员)中通过意图传递。我不想使用 id 到处查询。
我的问题是:
如何更改 ̀ Example` 以使我能够在不崩溃的情况下执行 new Bundle().putSerializable("test", new Example());。
感谢您的帮助!
【问题讨论】:
-
您将无法通过意图传递任何领域对象。您必须传递一个 ID 和查询。正如你所说,你不想这样做。这就是它的工作原理。还;你有什么问题???
-
好吧,我的问题是,如何做到这一点,使我的代码在
Example之外保持不变,即我可以在不崩溃的情况下执行new Bundle().putSerializable("example", new Example())。我更新了我的问题 -
根据我的评论。只有不使用 Realm 才能做到这一点。 RealmObjects 是与 Realm DB 直接连接的活动对象。通常,您甚至不会真正访问您创建的对象,但在编译期间,Realm 插件会生成一个从您的对象扩展的代理对象,而您真正使用的是该代理对象。只需尝试登录
Realm.getInstance().querySomething().getClass().getCanonicalName();,您就会发现它不再是您的实际对象了。 -
但是我不能重写 Serializable 的序列化方法以按 id 存储然后查询它吗?我的主要问题是瞬态使领域不快乐
-
所以如果我使用 Realm,我将永远无法通过 onSaveInstanceState 包存储对象来存储我的对象,我将不得不更改所有这些行为?
标签: java android serialization realm