/ / Gson ignoruje stratégiu vylúčenia serializácie - java, gson

Gson ignoruje stratégiu vylúčenia zo serializácie - java, gson

serializáciu

public class Subclass extends Superclass {
private static final long serialVersionUID = 1L;
private int someProperty;

public Subclass() {
}

public Subclass(int someProperty, String myProperty) {
super(myProperty);
this.someProperty = someProperty;
}

public int getSomeProperty() {
return someProperty;
}

public void setSomeProperty(int someProperty) {
this.someProperty = someProperty;
}
}

s

public class Superclass implements Serializable {
private static final long serialVersionUID = 1L;
private String myProperty;

public Superclass() {
}

public Superclass(String myProperty) {
this.myProperty = myProperty;
}

public String getMyProperty() {
return myProperty;
}

public void setMyProperty(String myProperty) {
this.myProperty = myProperty;
}
}

nemal by zlyhať kvôli

Exception in thread "main" java.lang.IllegalArgumentException: class richtercloud.gson.exclusion.strategy.Subclass declares multiple JSON fields named serialVersionUID
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.Gson.toJson(Gson.java:661)
at com.google.gson.Gson.toJson(Gson.java:648)
at com.google.gson.Gson.toJson(Gson.java:603)
at com.google.gson.Gson.toJson(Gson.java:583)
at richtercloud.gson.exclusion.strategy.Main.main(Main.java:41)

ak sa používa stratégia vylúčenia zo serializácie takto:

Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.TRANSIENT)
.addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
boolean retValue = f.getName().equals("serialVersionUID");
return retValue;
}

@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
})
.create();
Subclass a = new Subclass();
String response = gson.toJson(a);
System.out.println(response);

Používam Gson 2.8.2.

odpovede:

2 pre odpoveď č. 1

Zdá sa, že ide o známy problém:

Niektoré alternatívne riešenia

Riešenie č. 1: Použite typový adaptér

Odporúčaným riešením (pozri odkazy «Analýza»), riešenie, je zavedenie vhodného typu adaptéra.

Riešenie č. 2: Vylúčenie statických polí zo serializácie

Prečo vôbec nevylúčiť serializáciu statických polí?

new GsonBuilder()
// ...
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC)
// ...

Riešenie č. 3: Serializácia @Exposed iba polia

Je možné explicitne odhaliť serializovateľné polia pomocou @Exposed anotácia a konfigurácia GsonBuilder zodpovedajúcim spôsobom:

new GsonBuilder()
// ...
.excludeFieldsWithoutExposeAnnotation()
// ...