Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Parcelable helper to wrap object convertable with gson
public class ObjectGsonParceler {
private final Gson gson;
public ObjectGsonParceler(Gson gson) {
this.gson = gson;
}
public Parcelable wrap(Object instance) {
try {
String json = encode(instance);
return new Wrapper(json);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public <T> T unwrap(Parcelable parcelable) {
Wrapper wrapper = (Wrapper) parcelable;
try {
return decode(wrapper.json);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private String encode(Object instance) throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter writer = new JsonWriter(stringWriter);
try {
Class<?> type = instance.getClass();
writer.beginObject();
writer.name(type.getName());
gson.toJson(instance, type, writer);
writer.endObject();
return stringWriter.toString();
} finally {
writer.close();
}
}
private <T> T decode(String json) throws IOException {
JsonReader reader = new JsonReader(new StringReader(json));
try {
reader.beginObject();
Class<?> type = Class.forName(reader.nextName());
return gson.fromJson(reader, type);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} finally {
reader.close();
}
}
private static class Wrapper implements Parcelable {
final String json;
Wrapper(String json) {
this.json = json;
}
@Override public int describeContents() {
return 0;
}
@Override public void writeToParcel(Parcel out, int flags) {
out.writeString(json);
}
public static final Creator<Wrapper> CREATOR = new Creator<Wrapper>() {
@Override public Wrapper createFromParcel(Parcel in) {
String json = in.readString();
return new Wrapper(json);
}
@Override public Wrapper[] newArray(int size) {
return new Wrapper[size];
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment