Restore support for long serialization policy.

This commit is contained in:
Jesse Wilson 2011-08-04 22:57:36 +00:00
parent 5fc2db9e72
commit aa067056c3
4 changed files with 41 additions and 28 deletions

View File

@ -16,18 +16,6 @@
package com.google.gson;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.google.gson.internal.Streams;
import com.google.gson.internal.bind.ArrayTypeAdapter;
import com.google.gson.internal.bind.CollectionTypeAdapter;
@ -41,6 +29,17 @@ import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.google.gson.stream.MalformedJsonException;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* This is the main class for using Gson. Gson is typically used by first constructing a
@ -159,9 +158,10 @@ public final class Gson {
*/
public Gson() {
this(DEFAULT_EXCLUSION_STRATEGY, DEFAULT_EXCLUSION_STRATEGY, DEFAULT_NAMING_POLICY,
new MappedObjectConstructor(DefaultTypeAdapters.getDefaultInstanceCreators()),
false, DefaultTypeAdapters.getAllDefaultSerializers(),
DefaultTypeAdapters.getAllDefaultDeserializers(), DEFAULT_JSON_NON_EXECUTABLE, true, false);
new MappedObjectConstructor(DefaultTypeAdapters.getDefaultInstanceCreators()),
false, DefaultTypeAdapters.getAllDefaultSerializers(),
DefaultTypeAdapters.getAllDefaultDeserializers(), DEFAULT_JSON_NON_EXECUTABLE, true, false,
false, LongSerializationPolicy.DEFAULT);
}
Gson(ExclusionStrategy deserializationExclusionStrategy,
@ -170,7 +170,8 @@ public final class Gson {
final MappedObjectConstructor objectConstructor, boolean serializeNulls,
final ParameterizedTypeHandlerMap<JsonSerializer<?>> serializers,
final ParameterizedTypeHandlerMap<JsonDeserializer<?>> deserializers,
boolean generateNonExecutableGson, boolean htmlSafe, boolean prettyPrinting) {
boolean generateNonExecutableGson, boolean htmlSafe, boolean prettyPrinting,
boolean serializeSpecialFloatingPointValues, LongSerializationPolicy longSerializationPolicy) {
this.deserializationExclusionStrategy = deserializationExclusionStrategy;
this.serializationExclusionStrategy = serializationExclusionStrategy;
this.fieldNamingPolicy = fieldNamingPolicy;
@ -207,19 +208,35 @@ public final class Gson {
}
};
this.miniGson = new MiniGson.Builder()
MiniGson.Builder builder = new MiniGson.Builder()
.withoutDefaultFactories()
.factory(TypeAdapters.BOOLEAN_FACTORY)
.factory(TypeAdapters.INTEGER_FACTORY)
.factory(TypeAdapters.DOUBLE_FACTORY)
.factory(TypeAdapters.LONG_FACTORY)
.factory(TypeAdapters.newFactory(long.class, Long.class,
longAdapter(longSerializationPolicy)))
.factory(TypeAdapters.STRING_FACTORY)
.factory(new GsonToMiniGsonTypeAdapter(serializers, deserializers, serializeNulls))
.factory(CollectionTypeAdapter.FACTORY)
.factory(StringToValueMapTypeAdapter.FACTORY)
.factory(ArrayTypeAdapter.FACTORY)
.factory(reflectiveTypeAdapterFactory)
.build();
.factory(reflectiveTypeAdapterFactory);
this.miniGson = builder.build();
}
private TypeAdapter<Long> longAdapter(LongSerializationPolicy longSerializationPolicy) {
if (longSerializationPolicy == LongSerializationPolicy.DEFAULT) {
return TypeAdapters.LONG;
}
return new TypeAdapter<Long>() {
@Override public Long read(JsonReader reader) throws IOException {
return reader.nextLong();
}
@Override public void write(JsonWriter writer, Long value) throws IOException {
writer.value(value.toString());
}
};
}
private static ExclusionStrategy createExclusionStrategy() {

View File

@ -675,9 +675,6 @@ public final class GsonBuilder {
addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, customSerializers,
customDeserializers);
customSerializers.registerIfAbsent(DefaultTypeAdapters.getDefaultSerializers(
serializeSpecialFloatingPointValues, longSerializationPolicy));
customDeserializers.registerIfAbsent(DefaultTypeAdapters.getDefaultDeserializers());
ParameterizedTypeHandlerMap<InstanceCreator<?>> customInstanceCreators =
@ -690,12 +687,11 @@ public final class GsonBuilder {
MappedObjectConstructor objConstructor = new MappedObjectConstructor(customInstanceCreators);
Gson gson = new Gson(new DisjunctionExclusionStrategy(deserializationStrategies),
return new Gson(new DisjunctionExclusionStrategy(deserializationStrategies),
new DisjunctionExclusionStrategy(serializationStrategies),
fieldNamingPolicy, objConstructor, serializeNulls,
customSerializers, customDeserializers, generateNonExecutableJson, escapeHtmlChars,
prettyPrinting);
return gson;
prettyPrinting, serializeSpecialFloatingPointValues, longSerializationPolicy);
}
private static void addTypeAdaptersForDate(String datePattern, int dateStyle, int timeStyle,

View File

@ -106,7 +106,7 @@ public final class TypeAdapters {
};
}
private static <T> TypeAdapter.Factory newFactory(
public static <T> TypeAdapter.Factory newFactory(
final Class<T> unboxed, final Class<T> boxed, final TypeAdapter<T> typeAdapter) {
return new TypeAdapter.Factory() {
@SuppressWarnings("unchecked") // we use a runtime check to make sure the 'T's equal

View File

@ -42,7 +42,7 @@ public class FunctionWithInternalDependenciesTest extends TestCase {
new MappedObjectConstructor(DefaultTypeAdapters.getDefaultInstanceCreators()),
false, DefaultTypeAdapters.getDefaultSerializers(),
DefaultTypeAdapters.getDefaultDeserializers(), Gson.DEFAULT_JSON_NON_EXECUTABLE, true,
false);
false, false, LongSerializationPolicy.DEFAULT);
assertEquals("{}", gson.toJson(new ClassWithNoFields() {
// empty anonymous class
}));