package org.commcare.utils; import android.content.Intent; import android.os.Bundle; import org.commcare.CommCareApplication; import org.javarosa.core.util.externalizable.DeserializationException; import org.javarosa.core.util.externalizable.Externalizable; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; /** * @author ctsims */ public class SerializationUtil { public static byte[] serialize(Externalizable data) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { data.writeExternal(new DataOutputStream(baos)); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } return baos.toByteArray(); } public static <T extends Externalizable> T deserialize(byte[] bytes, Class<T> type) { T t; try { t = type.newInstance(); t.readExternal(new DataInputStream(new ByteArrayInputStream(bytes)), CommCareApplication.instance().getPrototypeFactory(CommCareApplication.instance())); } catch (IOException | InstantiationException | DeserializationException | IllegalAccessException e1) { e1.printStackTrace(); throw new RuntimeException(e1); } return t; } public static void serializeToIntent(Intent i, String name, Externalizable data) { i.putExtra(name, serialize(data)); } public static <T extends Externalizable> T deserializeFromIntent(Intent i, String name, Class<T> type) { if(!i.hasExtra(name)) { return null;} return deserialize(i.getByteArrayExtra(name), type); } public static void serializeToBundle(Bundle b, String name, Externalizable data) { b.putByteArray(name, serialize(data)); } public static <T extends Externalizable> T deserializeFromBundle(Bundle b, String name, Class<T> type) { if(!b.containsKey(name)) { return null;} return deserialize(b.getByteArray(name), type); } }