私はあなたがあなたの質問で言っているのとまったく同じことをしています。
Cloud Endpoints オブジェクトはネットワーク経由で送信するために既にシリアル化されているため、シリアル化してローカルに保存することもできます。追加のボーナスとして、Android 3.0 以降では、ライブラリをインポートする必要さえありません。ライブラリは既に存在します。例えば:
import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.json.GenericJson;
import com.google.api.client.json.JsonFactory;
private static final JsonFactory JSON_FACTORY = new AndroidJsonFactory();
public void putObject(String key, Object value) throws Exception {
byte[] outputbytes = null;
if (value instanceof GenericJson) {
outputbytes = JSON_FACTORY.toByteArray(value);
} else {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ObjectOutputStream objectstream = new ObjectOutputStream(output);
objectstream.writeObject(value);
objectstream.close();
outputbytes = output.toByteArray();
}
// persist "outputbytes" ...
}
public <T> T getObject(String key, Class<T> outclass) throws Exception {
// retrieve saved bytes...
byte[] valuebytes = ...
if (valuebytes[0] == '{' && valuebytes[1] == '"' && valuebytes[valuebytes.length-1] == '}') {
// Looks like JSON...
return JSON_FACTORY.fromString(new String(valuebytes, "UTF-8"), outclass);
} else {
ByteArrayInputStream input = new ByteArrayInputStream(valuebytes);
ObjectInputStream objectstream = new ObjectInputStream(input);
Object value = objectstream.readObject();
objectstream.close();
return outclass.cast(value);
}
}
長い文字列をシリアル化する場合、デフォルトAndroidJsonFactory
(Android v4.3 以降) は非常に遅いことに注意してください。JacksonFactory
パフォーマンスに問題がある場合は、代わりに新しいを作成してください。他のすべては同じままです。
更新: GenericJson オブジェクトのリストをシリアル化する場合は、それらのオブジェクトのリストを含む GenericJson オブジェクトを作成するだけです。例えば:
import com.google.api.client.json.GenericJson;
import com.google.api.client.util.Key;
public static class PersistantJson extends GenericJson {
@Key public int one;
@Key public String two;
}
public static class PersistantJsonList extends GenericJson {
@Key public List<PersistantJson> list = new ArrayList<PersistantJson>();
}
PersistantJson
すべての(つまり、「クラウド エンドポイント クライアント ライブラリの生成」によって作成された一部のクラス) オブジェクトを変数の.list
要素に追加し、PersistantJsonList
その変数を に渡すことができるようになりましたputObject()
。これには、リスト内のすべてのオブジェクトが同じクラスである必要があることに注意してください。これにより、逆シリアル化で型が何であるかがわかります (JSON シリアル化では型が記録されないため)。使用する場合List<Object>
、読み戻されるのは でList<Map<String, Object>>
あり、フィールドを手動で抽出する必要があります。