Ren*_*ier 6 java serialization android realm
我在我的项目中使用了Retrofit,Gson和Realm.我有这个课程Example需要Serializable.没有Realm,我会这样写:
public class Example implements Serializable {
@SerializationName("users")
private List<String> users
//... getters and setters
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
RealmString是:
public class RealmString extends RealmObject implements Serializable {
private String val;
//Constructors, getter and setter
}
Run Code Online (Sandbox Code Playgroud)
并添加一个自定义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;
}
}
Run Code Online (Sandbox Code Playgroud)
好的,现在我们开始觉得Realm开始对我们的代码产生很大的影响.但这是一个副作用问题,主要问题是Example不再是Serializable:RealmList不是.
所以我试图使RealmList瞬态并拥有可以使用@Ignore注释的下载List,并在序列化后重新创建RealmList.但Realm不接受瞬态.
现在我觉得有点卡住了,Example在我的代码的很多部分传递了意图(它是很多类的成员).我不想使用id并在任何地方查询它.
我的问题是:
如何以允许我new Bundle().putSerializable("test", new Example());不崩溃的方式更改Example` .
谢谢你的帮助!
Serializable不能与 一起使用RealmList,但您可以使用Parceler 库并实现 Parcelable \n 来打包 RealmObjects (注意:它将把它们变成非托管副本!)
@Parcel(implementations = { UserRealmProxy.class },\n value = Parcel.Serialization.BEAN,\n analyze = { User.class })\npublic class User extends RealmObject {\n // ...\n}\n\ncompile "org.parceler:parceler-api:1.0.3"\napt "org.parceler:parceler:1.0.3"\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n/* Copyright 2016 Patrick L\xc3\xb6wenstein\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License. */\n\npublic class RealmListParcelConverter implements TypeRangeParcelConverter<RealmList<? extends RealmObject>, RealmList<? extends RealmObject>> {\n private static final int NULL = -1;\n\n @Override\n public void toParcel(RealmList<? extends RealmObject> input, Parcel parcel) {\n if (input == null) {\n parcel.writeInt(NULL);\n } else {\n parcel.writeInt(input.size());\n for (RealmObject item : input) {\n parcel.writeParcelable(Parcels.wrap(item), 0);\n }\n }\n }\n\n @Override\n public RealmList fromParcel(Parcel parcel) {\n int size = parcel.readInt();\n RealmList list = new RealmList();\n\n for (int i=0; i<size; i++) {\n Parcelable parcelable = parcel.readParcelable(getClass().getClassLoader());\n list.add((RealmObject) Parcels.unwrap(parcelable));\n }\n\n return list;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1972 次 |
| 最近记录: |