package org.dayatang.utils.serializer;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.GsonBuilder;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
/**
* Created by yyang on 14/11/9.
*/
public class GsonSerializerBuilder {
private GsonBuilder builder;
public GsonSerializerBuilder() {
builder = new GsonBuilder();
}
public GsonSerializerBuilder(GsonBuilder builder) {
this.builder = builder;
}
public GsonSerializerBuilder serializeNulls() {
return new GsonSerializerBuilder(builder.serializeNulls());
}
public GsonSerializerBuilder excludeFieldsNamed(String... fieldNames) {
return new GsonSerializerBuilder(builder
.addSerializationExclusionStrategy(new FieldNameExclusionStrategy(fieldNames)));
}
public GsonSerializerBuilder excludeFieldsWithModifiers(int... modifiers) {
return new GsonSerializerBuilder(builder
.excludeFieldsWithModifiers(modifiers));
}
public GsonSerializerBuilder addSerializationExclusionStrategy(ExclusionStrategy strategy) {
return new GsonSerializerBuilder(builder
.addSerializationExclusionStrategy(strategy));
}
public GsonSerializerBuilder addDeserializationExclusionStrategy(ExclusionStrategy strategy) {
return new GsonSerializerBuilder(builder
.addDeserializationExclusionStrategy(strategy));
}
public GsonSerializerBuilder registerTypeAdapter(Type type, Object typeAdapter) {
return new GsonSerializerBuilder(builder.registerTypeAdapter(type, typeAdapter));
}
public GsonSerializerBuilder prettyPrinting() {
return new GsonSerializerBuilder(builder.setPrettyPrinting());
}
public GsonSerializerBuilder dateFormat(String pattern) {
return new GsonSerializerBuilder(builder.setDateFormat(pattern));
}
public GsonSerializer build() {
return new GsonSerializer(builder.create());
}
private static class FieldNameExclusionStrategy implements ExclusionStrategy {
private List<String> fieldNames;
private FieldNameExclusionStrategy(String... fieldNames) {
this.fieldNames = Arrays.asList(fieldNames);
}
@Override
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
return fieldNames.contains(fieldAttributes.getName());
}
@Override
public boolean shouldSkipClass(Class<?> aClass) {
return false;
}
}
}