Converted BitSetTypeAdapter to the new style.

This commit is contained in:
Inderjeet Singh 2011-09-16 05:02:30 +00:00
parent b90b43ea47
commit 915c5d4d6f
3 changed files with 62 additions and 47 deletions

View File

@ -16,21 +16,20 @@
package com.google.gson; package com.google.gson;
import com.google.gson.internal.ParameterizedTypeHandlerMap;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.sql.Time; import java.sql.Time;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.BitSet;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone; import java.util.TimeZone;
import com.google.gson.internal.ParameterizedTypeHandlerMap;
/** /**
* List of all the default type adapters ({@link JsonSerializer}s, {@link JsonDeserializer}s, * List of all the default type adapters ({@link JsonSerializer}s, {@link JsonDeserializer}s,
* and {@link InstanceCreator}s. * and {@link InstanceCreator}s.
@ -50,7 +49,6 @@ final class DefaultTypeAdapters {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static final EnumTypeAdapter ENUM_TYPE_ADAPTER = new EnumTypeAdapter(); private static final EnumTypeAdapter ENUM_TYPE_ADAPTER = new EnumTypeAdapter();
private static final BitSetTypeAdapter BIT_SET_ADAPTER = new BitSetTypeAdapter();
private static final CharacterTypeAdapter CHARACTER_TYPE_ADAPTER = new CharacterTypeAdapter(); private static final CharacterTypeAdapter CHARACTER_TYPE_ADAPTER = new CharacterTypeAdapter();
private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter(); private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter();
@ -82,7 +80,6 @@ final class DefaultTypeAdapters {
map.register(Time.class, TIME_TYPE_ADAPTER, true); map.register(Time.class, TIME_TYPE_ADAPTER, true);
map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
map.register(BitSet.class, BIT_SET_ADAPTER, true);
// Add primitive serializers // Add primitive serializers
map.register(Character.class, CHARACTER_TYPE_ADAPTER, true); map.register(Character.class, CHARACTER_TYPE_ADAPTER, true);
@ -109,7 +106,6 @@ final class DefaultTypeAdapters {
map.register(Time.class, wrapDeserializer(TIME_TYPE_ADAPTER), true); map.register(Time.class, wrapDeserializer(TIME_TYPE_ADAPTER), true);
map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
map.register(BitSet.class, BIT_SET_ADAPTER, true);
// Add primitive deserializers // Add primitive deserializers
map.register(Character.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER), true); map.register(Character.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER), true);
@ -377,38 +373,6 @@ final class DefaultTypeAdapters {
} }
} }
private static final class BitSetTypeAdapter implements JsonSerializer<BitSet>, JsonDeserializer<BitSet> {
public JsonElement serialize(BitSet src, Type typeOfSrc, JsonSerializationContext context) {
JsonArray array = new JsonArray();
for (int i = 0; i < src.length(); i++) {
int value = (src.get(i)) ? 1 : 0;
array.add(new JsonPrimitive(value));
}
return array;
}
public BitSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
if (!json.isJsonArray()) {
throw new JsonParseException("Expected an array of bits.");
}
BitSet result = new BitSet();
JsonArray array = json.getAsJsonArray();
for (int i = 0; i < array.size(); i++) {
JsonElement element = array.get(i);
if (element.getAsBoolean()) {
result.set(i);
}
}
return result;
}
@Override
public String toString() {
return BitSetTypeAdapter.class.getSimpleName();
}
}
private static final class NumberTypeAdapter private static final class NumberTypeAdapter
implements JsonSerializer<Number>, JsonDeserializer<Number> { implements JsonSerializer<Number>, JsonDeserializer<Number> {
public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext context) { public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext context) {

View File

@ -244,6 +244,7 @@ public final class Gson {
.factory(TypeAdapters.UUID_FACTORY) .factory(TypeAdapters.UUID_FACTORY)
.factory(TypeAdapters.LOCALE_FACTORY) .factory(TypeAdapters.LOCALE_FACTORY)
.factory(TypeAdapters.INET_ADDRESS_FACTORY) .factory(TypeAdapters.INET_ADDRESS_FACTORY)
.factory(TypeAdapters.BIT_SET_FACTORY)
.typeAdapter(BigDecimal.class, new BigDecimalTypeAdapter()) .typeAdapter(BigDecimal.class, new BigDecimalTypeAdapter())
.typeAdapter(BigInteger.class, new BigIntegerTypeAdapter()) .typeAdapter(BigInteger.class, new BigIntegerTypeAdapter())
.factory(new CollectionTypeAdapterFactory(constructorConstructor)) .factory(new CollectionTypeAdapterFactory(constructorConstructor))

View File

@ -16,6 +16,16 @@
package com.google.gson.internal.bind; package com.google.gson.internal.bind;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.BitSet;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.UUID;
import com.google.gson.JsonIOException; import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@ -23,21 +33,61 @@ import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter; import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.UUID;
/** /**
* Type adapters for basic types. * Type adapters for basic types.
*/ */
public final class TypeAdapters { public final class TypeAdapters {
private TypeAdapters() {} private TypeAdapters() {}
public static final TypeAdapter<BitSet> BIT_SET = new TypeAdapter<BitSet>() {
public BitSet read(JsonReader reader) throws IOException {
BitSet bitset = new BitSet();
reader.beginArray();
int i = 0;
JsonToken tokenType = reader.peek();
while (tokenType != JsonToken.END_ARRAY) {
boolean set = false;
switch (tokenType) {
case NUMBER:
set = reader.nextInt() != 0;
break;
case BOOLEAN:
set = reader.nextBoolean();
break;
case STRING:
String stringValue = reader.nextString();
try {
set = Integer.parseInt(stringValue) != 0;
} catch (NumberFormatException e) {
throw new JsonSyntaxException(
"Error: Expecting: bitset number value (1, 0), Found: " + stringValue);
}
break;
default:
throw new JsonSyntaxException("Invalid bitset value type: " + tokenType);
}
if (set) {
bitset.set(i);
}
++i;
tokenType = reader.peek();
}
reader.endArray();
return bitset;
}
public void write(JsonWriter writer, BitSet src) throws IOException {
writer.beginArray();
for (int i = 0; i < src.length(); i++) {
int value = (src.get(i)) ? 1 : 0;
writer.value(value);
}
writer.endArray();
}
};
public static final TypeAdapter.Factory BIT_SET_FACTORY = newFactory(BitSet.class, BIT_SET);
public static final TypeAdapter<Boolean> BOOLEAN = new TypeAdapter<Boolean>() { public static final TypeAdapter<Boolean> BOOLEAN = new TypeAdapter<Boolean>() {
@Override @Override
public Boolean read(JsonReader reader) throws IOException { public Boolean read(JsonReader reader) throws IOException {