From aa067056c3f0846f84ab94c771f3f756a9b3e40c Mon Sep 17 00:00:00 2001 From: Jesse Wilson Date: Thu, 4 Aug 2011 22:57:36 +0000 Subject: [PATCH] Restore support for long serialization policy. --- gson/src/main/java/com/google/gson/Gson.java | 57 ++++++++++++------- .../java/com/google/gson/GsonBuilder.java | 8 +-- .../gson/internal/bind/TypeAdapters.java | 2 +- .../FunctionWithInternalDependenciesTest.java | 2 +- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 2ce58ea7..4c2b079a 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -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> serializers, final ParameterizedTypeHandlerMap> 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 longAdapter(LongSerializationPolicy longSerializationPolicy) { + if (longSerializationPolicy == LongSerializationPolicy.DEFAULT) { + return TypeAdapters.LONG; + } + return new TypeAdapter() { + @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() { diff --git a/gson/src/main/java/com/google/gson/GsonBuilder.java b/gson/src/main/java/com/google/gson/GsonBuilder.java index 14554d8d..bd707044 100644 --- a/gson/src/main/java/com/google/gson/GsonBuilder.java +++ b/gson/src/main/java/com/google/gson/GsonBuilder.java @@ -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> 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, diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index 563a09e9..0baed306 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -106,7 +106,7 @@ public final class TypeAdapters { }; } - private static TypeAdapter.Factory newFactory( + public static TypeAdapter.Factory newFactory( final Class unboxed, final Class boxed, final TypeAdapter typeAdapter) { return new TypeAdapter.Factory() { @SuppressWarnings("unchecked") // we use a runtime check to make sure the 'T's equal diff --git a/gson/src/test/java/com/google/gson/FunctionWithInternalDependenciesTest.java b/gson/src/test/java/com/google/gson/FunctionWithInternalDependenciesTest.java index 5e1862a0..0b386e47 100644 --- a/gson/src/test/java/com/google/gson/FunctionWithInternalDependenciesTest.java +++ b/gson/src/test/java/com/google/gson/FunctionWithInternalDependenciesTest.java @@ -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 }));