私は2つのクラス、MyClass
とMyOtherClass
があるとします。私はMyClass
のシリアライザを書いた。これがなければ、MyOtherClass
をシリアル化しようとすると動作しません(MyClass
はシリアライザなしではシリアル化できません)。私のシリアライザはお互いに依存していますが、どうすれば両方を使うことができますか
package com.mycompany.javatest;
import com.google.gson.*;
import java.lang.reflect.*;
public class JavaTest {
static class MyClass {
private int someValue = 123;
}
static class MyOtherClass {
private MyClass mc = new MyClass();
}
static class MyClassSerializer implements JsonSerializer<MyClass> {
@Override
public JsonElement serialize(MyClass t, Type type, JsonSerializationContext jsc) {
JsonObject result = new JsonObject();
// (Doing some magic to serialize the object here...)
result.add("someValue", jsc.serialize(t.someValue));
return result;
}
}
static class MyOtherClassSerializer implements JsonSerializer<MyOtherClass> {
@Override
public JsonElement serialize(MyOtherClass t, Type type, JsonSerializationContext jsc) {
JsonObject result = new JsonObject();
result.add("mc", jsc.serialize(t.mc)); // <--- Will fail if not using the MyClassSerializer
return result;
}
}
public static void main(String[] args) {
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(MyOtherClassSerializer.class, new MyOtherClassSerializer());
Gson gson = gb.create();
MyOtherClass object = new MyOtherClass();
String json = gson.toJson(object, MyOtherClass.class); // <--- MyClassSerializer.serialize MUST be invoked, or this will fail
}
}
私の質問は、私はMyOtherClassSerializer
が登録されている場合MyClassSerializer
が登録されていることを強制する方法、ありますか?明らかな答えは、の両方のタイプのアダプタを登録することですが、MyOtherClassSerializer
の登録時に両方を登録する方法があるかどうかを知りたいと思います。 1つのオプションは、このような "register"メソッドによって型アダプタにアクセスできるようにすることですが、私はこの解決策が嫌いです。私はまだMyClassSerializer
にアクセスしたいです。
public void registerMyOtherClassSerializer(GsonBuilder builder) {
builder.registerTypeAdapter(MyClass.class, new MyClassSerializer());
builder.registerTypeAdapter(MyOtherClass.class, new MyOtherClassSerializer());
}
考えられますか?
代わりに2つの別々の' ClassSerializer'sを提供する:これは私がやってしまったものです/gson/TypeAdapterFactory.html)カスタムクラス用 –