簡體   English   中英

GSON:使用ReflectiveTypeAdapterFactory.Adapter對已注冊類型層次結構適配器的類的對象進行序列化/反序列化

[英]GSON: serialize/deserialize object of class, that have registered type hierarchy adapter, using ReflectiveTypeAdapterFactory.Adapter

為了清楚起見,讓我們介紹一些模型:

interface A {
    boolean isSomeCase();
}

class AAdapter implements JsonSerializer<A> {
    public JsonElement serialize(A src, Type typeOfSrc, JsonSerializationContext context) {
        if (src.isSomeCase()) {
            /* some logic */
            return result;
        } else {
            JsonObject json = new JsonObject();
            JsonElement valueJson = <???>; // TODO serialize src like POJO
            json.add(src.getClass().getSimpleName(), valueJson);
            return json;
        } 
    }
}

Gson gson = new GsonBuilder()
        .registerTypeHierarchyAdapter(A.class. new AAdapter())
        .create();

像其他對象一樣,如何將A isSomeCase() = false實例化,該實例由ReflectiveTypeAdapterFactory.Adapter序列化。

您可以編寫一個自定義TypeAdapterFactory並在其TypeAdapterwrite()方法中處理傳入對象的isSomeCase()結果,並在其中應用您的邏輯:

public class ATypeAdapterFactory implements TypeAdapterFactory {

    public TypeAdapter<A> create(Gson gson, TypeToken type) {
        if (!A.class.isAssignableFrom(type.getRawType())) {
            // Check if incoming raw type is an instance of A interface
            return null;
        } 

        final TypeAdapter<A> delegate = gson.getDelegateAdapter(this, type);

        return new TypeAdapter<A>() {

            @Override
            public void write(JsonWriter out, A value) throws IOException {
                if(value.isSomeCase()) {
                    // your custom logic here
                    out.beginObject();
                    out.name("x").value(0);
                    out.endObject();
                } else {
                    // default serialization here
                    delegate.write(out, value);
                }
            }

            @Override
            public A read(JsonReader in) throws IOException {
                return delegate.read(in);
            }
        };
    }
}

測試:

final GsonBuilder gsonBuilder = new GsonBuilder();
// Register custom type adapter factory
gsonBuilder.registerTypeAdapterFactory(new ATypeAdapterFactory());
final Gson gson = gsonBuilder.create();

A aSomeCaseTrue = new AImpl(true);
System.out.print("aSomeCaseTrue:" + gson.toJson(aSomeCaseTrue));
// writes; aSomeCaseTrue:{"x":0}


A aSomeCaseFalse = new AImpl(false);
System.out.print("aSomeCaseFalse:" + gson.toJson(aSomeCaseFalse););
// writes; aSomeCaseFalse:{"someCase":false}

附加功能:

1)您的界面:

interface A {
    boolean isSomeCase();
}

2)一個實現您的示例接口的示例類:

class AImpl implements A {
    boolean someCase;

    public AImpl(boolean value) {
        this.someCase = value;
    }

    @Override
    public boolean isSomeCase() {
        return someCase;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM