我使用CustomizedTypeAdapterFactory解决了它。
基本上首先写一个定制的适配器:
public abstract class CustomizedTypeAdapterFactory<C> implements TypeAdapterFactory{ private final Class<C> customizedClass; public CustomizedTypeAdapterFactory(Class<C> customizedClass) { this.customizedClass = customizedClass; } @SuppressWarnings("unchecked") // we use a runtime check to guarantee that 'C' and 'T' are equal public final <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { return type.getRawType() == customizedClass ? (TypeAdapter<T>) customizeMyClassAdapter(gson, (TypeToken<C>) type) : null; } private TypeAdapter<C> customizeMyClassAdapter(Gson gson, TypeToken<C> type) { final TypeAdapter<C> delegate = gson.getDelegateAdapter(this, type); final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class); return new TypeAdapter<C>() { @Override public void write(JsonWriter out, C value) throws IOException { JsonElement tree = delegate.toJsonTree(value); beforeWrite(value, tree); elementAdapter.write(out, tree); } @Override public C read(JsonReader in) throws IOException { JsonElement tree = elementAdapter.read(in); afterRead(tree); return delegate.fromJsonTree(tree); } }; } protected void beforeWrite(C source, JsonElement toSerialize) { } protected void afterRead(JsonElement deserialized) { }}
然后为所有需要考虑的类创建一个子类。您必须为每个包含long的类创建一个(在这种情况下)。但是除了long值(以及任何其他bson特定值)之外,您无需序列化任何内容
public class MyTestObjectTypeAdapterFactory extends CustomizedTypeAdapterFactory<MyTestObject>{ public MyTestObjectTypeAdapterFactory() { super(MyTestObject.class); } @Override protected void beforeWrite(MyTestObject source, JsonElement toSerialize) { //you could convert back the other way here, I let mongo's document parser take care of that. } @Override protected void afterRead(JsonElement deserialized) { JsonObject timestamp = deserialized.getAsJsonObject().get("timestamp").getAsJsonObject(); deserialized.getAsJsonObject().remove("timestamp"); deserialized.getAsJsonObject().add("timestamp",timestamp.get("$numberLong")); }}
然后生成具有以下内容的Gson:
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new MyTestObjectTypeAdapterFactory()).create();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)