2014-10-27 47 views
0

需要明確的是,讓introduse一些模型:GSON:序列化/類的反序列化對象,已註冊類型層次適配器,使用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(); 

它是如何可能的serealize的A某些情況下,其中isSomeCase() = false,與其他任何對象一樣,由ReflectiveTypeAdapterFactory.Adapter序列化。

回答

2

您可以編寫自定義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; 
    } 
} 
+1

我已經解決了問題,這種方式(使用'TypeAdapterFactory')。但是你已經介紹了'getDelegateAdapter'方法。我曾經使用過版本2.1,它在那裏被取消。所以你已經讓我的代碼更清潔了。非常感謝! – 2014-10-28 10:25:59