RealmList序列化问题(Realm/Gson/Intent)

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` .

谢谢你的帮助!

Epi*_*rce 3

Serializable不能与 一起使用RealmList,但您可以使用Parceler 库并实现 Parcelable \n 来打包 RealmObjects (注意:它将把它们变成非托管副本!)

\n\n
@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"\n
Run Code Online (Sandbox Code Playgroud)\n\n

打包 RealmList,请使用以下代码

\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}\n
Run Code Online (Sandbox Code Playgroud)\n