RealmList serialization issues (Realm / Gson / Intent)

I use Retrofit, Gson and Realm in my project. I have an Example class that should be Serializable . Without the Kingdom, I would write this:

 public class Example implements Serializable { @SerializationName("users") private List<String> users //... getters and setters } 

The kingdom comes into play and Example becomes (note that getters and setters are the way for compatibility reasons):

 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; } } 

using RealmString:

 public class RealmString extends RealmObject implements Serializable { private String val; //Constructors, getter and setter } 

and add a custom converter like Gson to deserialize it:

 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; } } 

So, now we are starting to feel that Realm is beginning to strongly influence our code. But this is a problem, the main problem is that Example is no longer Serializable: RealmList is not.

so I tried to make the RealmList transition process and have its list of subscriptions, which I can annotate with @Ignore and recreate the RealmList after serialization. But the transient is not accepted by the kingdom.

Now I feel a little stuck, Example is passed through intentions in many parts of my code (it is a member of many classes). I do not want to use id and request it everywhere.

My question is:

How can I change Example` so that I can make new Bundle().putSerializable("test", new Example()); without crashing.

Thanks for the help!

+6
source share
2 answers

Serializable will not work with RealmList , but you can use the Parceler library and implement Parcelable to send RealmObjects (note: it will turn them into unmanaged copies!)

 @Parcel(implementations = { UserRealmProxy.class }, value = Parcel.Serialization.BEAN, analyze = { User.class }) public class User extends RealmObject { // ... } compile "org.parceler:parceler-api:1.0.3" apt "org.parceler:parceler:1.0.3" 

In RealmList package use the following code

 /* Copyright 2016 Patrick LΓΆwenstein * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class RealmListParcelConverter implements TypeRangeParcelConverter<RealmList<? extends RealmObject>, RealmList<? extends RealmObject>> { private static final int NULL = -1; @Override public void toParcel(RealmList<? extends RealmObject> input, Parcel parcel) { if (input == null) { parcel.writeInt(NULL); } else { parcel.writeInt(input.size()); for (RealmObject item : input) { parcel.writeParcelable(Parcels.wrap(item), 0); } } } @Override public RealmList fromParcel(Parcel parcel) { int size = parcel.readInt(); RealmList list = new RealmList(); for (int i=0; i<size; i++) { Parcelable parcelable = parcel.readParcelable(getClass().getClassLoader()); list.add((RealmObject) Parcels.unwrap(parcelable)); } return list; } } 
+3
source

Step 1:

  Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getDeclaringClass().equals(RealmObject.class); } @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }) .create(); 

and

  intent.putExtra("userfrom",gson.toJson(obj)); 

Step 2:

  Gson gson = new GsonBuilder().create(); user = gson.fromJson(getIntent().getStringExtra("userfrom"),User.class); 

I used this to transmit data using Intent, but worked to modify

0
source

All Articles