Android Gson框架源码深度解析:Gson类核心机制与配置体系(2)

37 阅读28分钟

码字不易,请大佬们点点关注,谢谢~

一、Gson类的架构定位与设计哲学

1.1 作为框架入口的核心职责

Gson类是Google Gson框架的核心入口点,承担着协调JSON序列化与反序列化流程的核心职责。作为用户与框架交互的主要接口,Gson类封装了复杂的类型适配器管理、配置解析和反射操作,为开发者提供了简洁统一的API。其设计遵循了以下核心原则:

1.1.1 配置与执行分离

Gson类通过工厂模式与GsonBuilder配合,实现了配置过程与执行过程的分离。这种设计允许用户通过GsonBuilder定制各种序列化和反序列化策略,而Gson类则专注于执行这些策略:

// GsonBuilder负责配置参数
Gson gson = new GsonBuilder()
    .setPrettyPrinting()          // 配置JSON美化输出
    .excludeFieldsWithoutExposeAnnotation() // 配置只处理带@Expose注解的字段
    .registerTypeAdapter(Date.class, new DateTypeAdapter()) // 注册自定义类型适配器
    .create(); // 创建不可变的Gson实例

// Gson实例负责执行序列化/反序列化
String json = gson.toJson(myObject);
MyType obj = gson.fromJson(json, MyType.class);
1.1.2 不可变性与线程安全

Gson实例一旦创建即为不可变对象,所有配置参数在创建时确定,之后无法修改。这种设计使得Gson实例可以安全地在多线程环境中共享:

// Gson类的构造函数使用参数对象初始化,创建后不可变
public final class Gson {
    private final List<TypeAdapterFactory> factories;
    private final FieldNamingStrategy fieldNamingStrategy;
    private final LongSerializationPolicy longSerializationPolicy;
    // 其他不可变配置字段...
    
    Gson(
        List<TypeAdapterFactory> factories,
        FieldNamingStrategy fieldNamingStrategy,
        LongSerializationPolicy longSerializationPolicy,
        // 其他参数...
    ) {
        this.factories = factories;
        this.fieldNamingStrategy = fieldNamingStrategy;
        this.longSerializationPolicy = longSerializationPolicy;
        // 初始化其他字段...
    }
    
    // 所有配置相关方法均由GsonBuilder提供
}

1.2 核心组件的协同关系

Gson类作为框架核心,与以下关键组件协同工作:

1.2.1 TypeAdapter体系

TypeAdapter是Gson处理序列化和反序列化的核心接口,Gson类通过TypeAdapterFactory注册表来查找和创建特定类型的适配器:

public final class Gson {
    // 存储所有已注册的TypeAdapterFactory
    private final List<TypeAdapterFactory> factories;
    
    // 根据类型获取对应的TypeAdapter
    public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
        // 从缓存中查找适配器
        TypeAdapter<?> cached = typeTokenCache.get(type);
        if (cached != null) {
            return (TypeAdapter<T>) cached;
        }
        
        // 缓存未命中时,遍历工厂列表查找匹配的工厂
        for (TypeAdapterFactory factory : factories) {
            TypeAdapter<T> candidate = factory.create(this, type);
            if (candidate != null) {
                // 找到匹配的工厂后,缓存适配器并返回
                typeTokenCache.put(type, candidate);
                return candidate;
            }
        }
        
        throw new IllegalArgumentException("Gson cannot handle " + type);
    }
}
1.2.2 JsonReader与JsonWriter

JsonReader和JsonWriter是Gson处理JSON读写的底层组件,Gson类通过它们实现与JSON文本的交互:

public final class Gson {
    // 将对象序列化为JSON并写入指定的JsonWriter
    public void toJson(Object src, Type typeOfSrc, JsonWriter writer) throws JsonIOException {
        // 获取类型适配器
        TypeAdapter<?> adapter = getAdapter(TypeToken.get(typeOfSrc));
        
        // 调用适配器的write方法进行序列化
        ((TypeAdapter<Object>) adapter).write(writer, src);
    }
    
    // 从JsonReader读取JSON并反序列化为对象
    public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {
        // 获取类型适配器
        TypeAdapter<?> adapter = getAdapter(TypeToken.get(typeOfT));
        
        // 调用适配器的read方法进行反序列化
        return (T) adapter.read(reader);
    }
}
1.2.3 反射与类型处理

Gson通过反射机制处理Java对象的字段,并使用TypeToken解决Java泛型类型擦除问题:

public final class Gson {
    // 使用反射创建对象实例
    private final ConstructorConstructor constructorConstructor;
    
    // 处理带泛型的类型
    public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
        // 创建TypeToken保存泛型信息
        TypeToken<T> typeToken = (TypeToken<T>) TypeToken.get(typeOfT);
        
        // 使用保存的泛型信息获取适配器
        TypeAdapter<T> adapter = getAdapter(typeToken);
        
        // 执行反序列化
        return adapter.fromJson(json);
    }
}

二、Gson类的初始化与配置体系

2.1 GsonBuilder的配置机制

GsonBuilder是创建Gson实例的唯一方式,通过流式API提供了丰富的配置选项:

public final class GsonBuilder {
    // 配置参数
    private boolean serializeNulls = false;
    private boolean prettyPrinting = false;
    private boolean lenient = false;
    private boolean generateNonExecutableJson = false;
    private boolean escapeHtmlChars = true;
    private LongSerializationPolicy longSerializationPolicy = LongSerializationPolicy.DEFAULT;
    private FieldNamingStrategy fieldNamingPolicy = FieldNamingPolicy.IDENTITY;
    private final List<ExclusionStrategy> exclusionStrategies = new ArrayList<>();
    private final List<TypeAdapterFactory> factories = new ArrayList<>();
    private final Map<Type, InstanceCreator<?>> instanceCreators = new LinkedHashMap<>();
    // 其他配置参数...
    
    // 设置是否序列化null值
    public GsonBuilder serializeNulls() {
        this.serializeNulls = true;
        return this;
    }
    
    // 设置是否美化输出JSON
    public GsonBuilder setPrettyPrinting() {
        this.prettyPrinting = true;
        return this;
    }
    
    // 设置JSON解析是否宽松模式
    public GsonBuilder setLenient() {
        this.lenient = true;
        return this;
    }
    
    // 注册自定义类型适配器
    public <T> GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {
        // 验证typeAdapter是否为JsonSerializer或JsonDeserializer的实例
        if (typeAdapter instanceof JsonSerializer || typeAdapter instanceof JsonDeserializer) {
            // 创建适配器工厂并添加到工厂列表
            factories.add(TypeAdapters.newFactory(TypeToken.get(type), typeAdapter));
        } else if (typeAdapter instanceof TypeAdapter) {
            // 直接添加TypeAdapter工厂
            factories.add(TypeAdapters.newFactory(TypeToken.get(type), (TypeAdapter<?>) typeAdapter));
        } else {
            throw new IllegalArgumentException("Expected a TypeAdapter, JsonSerializer or JsonDeserializer");
        }
        return this;
    }
    
    // 创建Gson实例
    public Gson create() {
        // 构建最终的TypeAdapter工厂列表
        List<TypeAdapterFactory> factories = buildFactories();
        
        // 创建并返回Gson实例
        return new Gson(
            factories,
            instanceCreators,
            serializeNulls,
            generateNonExecutableJson,
            escapeHtmlChars,
            prettyPrinting,
            lenient,
            fieldNamingPolicy,
            longSerializationPolicy,
            exclusionStrategies,
            // 其他配置参数...
        );
    }
    
    // 构建完整的工厂列表,包括内置工厂和用户注册的工厂
    private List<TypeAdapterFactory> buildFactories() {
        List<TypeAdapterFactory> factories = new ArrayList<>();
        
        // 1. 添加用户注册的序列化器/反序列化器工厂(最高优先级)
        factories.addAll(this.factories);
        
        // 2. 添加内置的核心工厂
        factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
        factories.add(ObjectTypeAdapter.FACTORY);
        
        // 3. 添加集合类型工厂
        factories.add(new CollectionTypeAdapterFactory(constructorConstructor));
        factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
        
        // 4. 添加反射类型工厂(处理普通Java对象)
        factories.add(new ReflectiveTypeAdapterFactory(
            constructorConstructor,
            fieldNamingPolicy,
            exclusionStrategies,
            jsonAdapterFactory));
        
        // 5. 添加其他内置工厂...
        
        return Collections.unmodifiableList(factories);
    }
}

2.2 配置参数的优先级体系

Gson的配置参数具有明确的优先级顺序,这确保了用户自定义配置能够覆盖默认行为:

  1. 用户注册的TypeAdapter:通过GsonBuilder.registerTypeAdapter()注册的适配器具有最高优先级
  2. 用户配置的策略:如字段命名策略、排除策略等
  3. Gson内置的默认适配器:处理基本类型、集合、映射等常见类型
  4. 反射机制:作为最后的手段,处理没有自定义适配器的类型

2.3 类型适配器工厂的注册与排序

GsonBuilder在创建Gson实例时,会将所有注册的TypeAdapterFactory按特定顺序排列:

// GsonBuilder的buildFactories方法片段
private List<TypeAdapterFactory> buildFactories() {
    List<TypeAdapterFactory> factories = new ArrayList<>();
    
    // 1. 添加用户注册的工厂(按注册顺序,先注册的优先级高)
    factories.addAll(this.factories);
    
    // 2. 添加内置工厂(固定顺序)
    factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
    factories.add(ObjectTypeAdapter.FACTORY);
    factories.add(new CollectionTypeAdapterFactory(constructorConstructor));
    factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
    factories.add(new ReflectiveTypeAdapterFactory(
        constructorConstructor,
        fieldNamingPolicy,
        exclusionStrategies,
        jsonAdapterFactory));
    
    return Collections.unmodifiableList(factories);
}

这种排序确保了用户自定义的适配器能够优先被应用,而内置适配器则作为后备选项处理未被特殊处理的类型。

三、序列化流程的实现细节

3.1 序列化的入口方法

Gson类提供了多个重载的toJson()方法,最终都会调用到核心的序列化方法:

public final class Gson {
    // 最核心的序列化方法,将对象序列化为JSON并写入JsonWriter
    public void toJson(Object src, Type typeOfSrc, JsonWriter writer) throws JsonIOException {
        // 获取对象的类型适配器
        TypeAdapter<?> adapter = getAdapter(TypeToken.get(typeOfSrc));
        
        // 设置JsonWriter的宽松模式
        boolean oldLenient = writer.isLenient();
        writer.setLenient(true);
        
        try {
            // 调用适配器的write方法执行序列化
            ((TypeAdapter<Object>) adapter).write(writer, src);
        } catch (IOException e) {
            throw new JsonIOException(e);
        } finally {
            // 恢复JsonWriter的原始宽松模式设置
            writer.setLenient(oldLenient);
        }
    }
    
    // 常用的序列化方法,将对象转换为JSON字符串
    public String toJson(Object src) {
        if (src == null) {
            return toJson(JsonNull.INSTANCE);
        }
        // 获取对象的实际类型
        Type typeOfSrc = src.getClass();
        return toJson(src, typeOfSrc);
    }
    
    // 将对象按照指定类型转换为JSON字符串
    public String toJson(Object src, Type typeOfSrc) {
        StringWriter writer = new StringWriter();
        toJson(src, typeOfSrc, writer);
        return writer.toString();
    }
    
    // 将对象按照指定类型序列化为JSON并写入Appendable
    public void toJson(Object src, Type typeOfSrc, Appendable writer) throws JsonIOException {
        try {
            // 创建JsonWriter包装Appendable
            JsonWriter jsonWriter = newJsonWriter(Streams.writerForAppendable(writer));
            toJson(src, typeOfSrc, jsonWriter);
        } catch (IOException e) {
            throw new JsonIOException(e);
        }
    }
}

3.2 类型适配器的查找过程

Gson通过getAdapter()方法查找处理特定类型的TypeAdapter,这是一个关键流程:

public final class Gson {
    // 类型适配器缓存,提高性能
    private final ConcurrentMap<TypeToken<?>, TypeAdapter<?>> typeTokenCache = new ConcurrentHashMap<>();
    
    // 根据TypeToken获取对应的TypeAdapter
    public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
        // 首先从缓存中查找适配器
        TypeAdapter<?> cached = typeTokenCache.get(type);
        if (cached != null) {
            return (TypeAdapter<T>) cached;
        }
        
        // 缓存未命中时,处理可能的递归调用(防止循环引用)
        Map<TypeToken<?>, TypeAdapter<?>> threadCalls = calls.get();
        boolean requiresThreadLocalCleanup = false;
        if (threadCalls == null) {
            threadCalls = new HashMap<>();
            calls.set(threadCalls);
            requiresThreadLocalCleanup = true;
        }
        
        // 检查是否正在处理当前类型(防止循环引用导致的栈溢出)
        TypeAdapter<?> candidate = threadCalls.get(type);
        if (candidate != null) {
            return (TypeAdapter<T>) candidate;
        }
        
        try {
            // 标记正在处理当前类型
            threadCalls.put(type, null);
            
            // 遍历工厂列表,查找能够处理该类型的工厂
            for (TypeAdapterFactory factory : factories) {
                TypeAdapter<T> candidateAdapter = factory.create(this, type);
                if (candidateAdapter != null) {
                    // 找到匹配的工厂后,缓存适配器并返回
                    typeTokenCache.put(type, candidateAdapter);
                    return candidateAdapter;
                }
            }
            
            // 没有找到合适的工厂,抛出异常
            throw new IllegalArgumentException("Gson cannot handle " + type);
        } finally {
            // 移除正在处理的标记
            threadCalls.remove(type);
            
            // 清理线程本地存储
            if (requiresThreadLocalCleanup) {
                calls.remove();
            }
        }
    }
}

3.3 对象序列化的反射实现

对于普通Java对象,Gson使用ReflectiveTypeAdapter进行序列化,这是最常见的场景:

public final class ReflectiveTypeAdapterFactory implements TypeAdapterFactory {
    // 反射类型适配器的实现
    static final class Adapter<T> extends TypeAdapter<T> {
        private final ObjectConstructor<T> constructor;
        private final Map<String, BoundField> boundFields;
        
        Adapter(ObjectConstructor<T> constructor, Map<String, BoundField> boundFields) {
            this.constructor = constructor;
            this.boundFields = boundFields;
        }
        
        @Override
        public T read(JsonReader in) throws IOException {
            // 反序列化实现...
        }
        
        @Override
        public void write(JsonWriter out, T value) throws IOException {
            if (value == null) {
                out.nullValue();
                return;
            }
            
            // 开始写入JSON对象
            out.beginObject();
            
            try {
                // 遍历所有绑定的字段
                for (BoundField boundField : boundFields.values()) {
                    // 检查字段是否应该被序列化
                    if (boundField.writeField(value)) {
                        // 写入字段名
                        out.name(boundField.name);
                        
                        // 写入字段值
                        boundField.write(out, value);
                    }
                }
            } catch (IllegalAccessException e) {
                throw new AssertionError(e);
            }
            
            // 结束写入JSON对象
            out.endObject();
        }
    }
    
    // 绑定字段类,封装了字段的序列化和反序列化逻辑
    abstract static class BoundField {
        final String name;
        final boolean serialized;
        final boolean deserialized;
        
        protected BoundField(String name, boolean serialized, boolean deserialized) {
            this.name = name;
            this.serialized = serialized;
            this.deserialized = deserialized;
        }
        
        // 检查字段是否应该被序列化
        abstract boolean writeField(Object value) throws IOException, IllegalAccessException;
        
        // 写入字段值
        abstract void write(JsonWriter writer, Object value) throws IOException, IllegalAccessException;
        
        // 读取字段值
        abstract void read(JsonReader reader, Object value) throws IOException, IllegalAccessException;
    }
}

3.4 集合与映射的序列化

对于集合和映射类型,Gson使用专门的TypeAdapter进行处理:

// 集合类型适配器工厂
public final class CollectionTypeAdapterFactory implements TypeAdapterFactory {
    private final ConstructorConstructor constructorConstructor;
    
    public CollectionTypeAdapterFactory(ConstructorConstructor constructorConstructor) {
        this.constructorConstructor = constructorConstructor;
    }
    
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
        Type type = typeToken.getType();
        
        // 检查是否为集合类型
        Class<? super T> rawType = typeToken.getRawType();
        if (!Collection.class.isAssignableFrom(rawType)) {
            return null;
        }
        
        // 获取集合元素的类型
        Type elementType = $Gson$Types.getCollectionElementType(type, rawType);
        TypeAdapter<?> elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
        
        // 创建集合的实例构造器
        ObjectConstructor<T> constructor = constructorConstructor.get(typeToken);
        
        // 创建集合类型适配器
        @SuppressWarnings({"unchecked", "rawtypes"})
        TypeAdapter<T> result = new Adapter(gson, elementType, elementTypeAdapter, constructor);
        return result;
    }
    
    // 集合类型适配器实现
    private static final class Adapter<E> extends TypeAdapter<Collection<E>> {
        private final TypeAdapter<E> elementTypeAdapter;
        private final ObjectConstructor<? extends Collection<E>> constructor;
        
        Adapter(Gson context, Type elementType,
                TypeAdapter<E> elementTypeAdapter,
                ObjectConstructor<? extends Collection<E>> constructor) {
            this.elementTypeAdapter =
                    new TypeAdapterRuntimeTypeWrapper<>(context, elementTypeAdapter, elementType);
            this.constructor = constructor;
        }
        
        @Override
        public Collection<E> read(JsonReader in) throws IOException {
            // 反序列化实现...
        }
        
        @Override
        public void write(JsonWriter out, Collection<E> collection) throws IOException {
            if (collection == null) {
                out.nullValue();
                return;
            }
            
            // 开始写入JSON数组
            out.beginArray();
            
            // 遍历集合并序列化每个元素
            for (E element : collection) {
                elementTypeAdapter.write(out, element);
            }
            
            // 结束写入JSON数组
            out.endArray();
        }
    }
}

// 映射类型适配器工厂
public final class MapTypeAdapterFactory implements TypeAdapterFactory {
    private final ConstructorConstructor constructorConstructor;
    private final boolean complexMapKeySerialization;
    
    public MapTypeAdapterFactory(ConstructorConstructor constructorConstructor,
                                 boolean complexMapKeySerialization) {
        this.constructorConstructor = constructorConstructor;
        this.complexMapKeySerialization = complexMapKeySerialization;
    }
    
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
        Type type = typeToken.getType();
        
        // 检查是否为映射类型
        Class<? super T> rawType = typeToken.getRawType();
        if (!Map.class.isAssignableFrom(rawType)) {
            return null;
        }
        
        // 获取映射键和值的类型
        Type[] keyAndValueTypes = $Gson$Types.getMapKeyAndValueTypes(type, rawType);
        TypeAdapter<?> keyAdapter = getKeyAdapter(gson, keyAndValueTypes[0]);
        TypeAdapter<?> valueAdapter = gson.getAdapter(TypeToken.get(keyAndValueTypes[1]));
        
        // 创建映射的实例构造器
        ObjectConstructor<T> constructor = constructorConstructor.get(typeToken);
        
        // 创建映射类型适配器
        @SuppressWarnings({"unchecked", "rawtypes"})
        TypeAdapter<T> result = new Adapter(gson, keyAndValueTypes[0], keyAdapter,
                keyAndValueTypes[1], valueAdapter, constructor);
        return result;
    }
    
    // 获取键的适配器,处理特殊情况
    private TypeAdapter<?> getKeyAdapter(Gson context, Type keyType) {
        // 对于基本类型的键,使用特殊处理
        if (keyType == boolean.class || keyType == Boolean.class) {
            return TypeAdapters.BOOLEAN_AS_STRING;
        }
        if (keyType == char.class || keyType == Character.class) {
            return TypeAdapters.STRING;
        }
        if (keyType == Number.class) {
            return TypeAdapters.STRING;
        }
        
        // 对于其他类型的键,使用默认适配器
        TypeAdapter<?> adapter = context.getAdapter(TypeToken.get(keyType));
        if (!(adapter instanceof StringTypeAdapter)) {
            adapter = new StringAdapter(adapter);
        }
        return adapter;
    }
    
    // 映射类型适配器实现
    private static final class Adapter<K, V> extends TypeAdapter<Map<K, V>> {
        private final TypeAdapter<K> keyTypeAdapter;
        private final TypeAdapter<V> valueTypeAdapter;
        private final ObjectConstructor<? extends Map<K, V>> constructor;
        
        Adapter(Gson context, Type keyType, TypeAdapter<K> keyTypeAdapter,
                Type valueType, TypeAdapter<V> valueTypeAdapter,
                ObjectConstructor<? extends Map<K, V>> constructor) {
            this.keyTypeAdapter = new TypeAdapterRuntimeTypeWrapper<>(context, keyTypeAdapter, keyType);
            this.valueTypeAdapter = new TypeAdapterRuntimeTypeWrapper<>(context, valueTypeAdapter, valueType);
            this.constructor = constructor;
        }
        
        @Override
        public Map<K, V> read(JsonReader in) throws IOException {
            // 反序列化实现...
        }
        
        @Override
        public void write(JsonWriter out, Map<K, V> map) throws IOException {
            if (map == null) {
                out.nullValue();
                return;
            }
            
            // 开始写入JSON对象
            out.beginObject();
            
            // 遍历映射并序列化每个键值对
            for (Map.Entry<K, V> entry : map.entrySet()) {
                // 序列化键
                String key = keyTypeAdapter.toJsonTree(entry.getKey()).getAsString();
                
                // 写入键
                out.name(key);
                
                // 序列化并写入值
                valueTypeAdapter.write(out, entry.getValue());
            }
            
            // 结束写入JSON对象
            out.endObject();
        }
    }
}

四、反序列化流程的实现细节

4.1 反序列化的入口方法

Gson类提供了多个重载的fromJson()方法,最终都会调用到核心的反序列化方法:

public final class Gson {
    // 最核心的反序列化方法,从JsonReader读取JSON并反序列化为对象
    public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {
        boolean isEmpty = true;
        boolean oldLenient = reader.isLenient();
        reader.setLenient(true);
        
        try {
            // 检查JSON是否有内容
            reader.peek();
            isEmpty = false;
            
            // 获取类型适配器
            TypeAdapter<?> adapter = getAdapter(TypeToken.get(typeOfT));
            
            // 调用适配器的read方法执行反序列化
            T result = (T) adapter.read(reader);
            
            // 确保JSON被完全消耗
            assertFullConsumption(reader, typeOfT);
            
            return result;
        } catch (EOFException e) {
            // 处理空JSON的情况
            if (isEmpty) {
                return null;
            }
            throw new JsonSyntaxException(e);
        } catch (IllegalStateException e) {
            throw new JsonSyntaxException(e);
        } catch (IOException e) {
            throw new JsonIOException(e);
        } catch (AssertionError e) {
            throw new JsonIOException(e);
        } finally {
            // 恢复JsonReader的原始宽松模式设置
            reader.setLenient(oldLenient);
        }
    }
    
    // 常用的反序列化方法,从JSON字符串反序列化为对象
    public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
        if (json == null) {
            return null;
        }
        
        // 创建StringReader读取JSON字符串
        StringReader reader = new StringReader(json);
        
        // 调用核心反序列化方法
        return fromJson(reader, typeOfT);
    }
    
    // 从Reader反序列化为对象
    public <T> T fromJson(Reader json, Type typeOfT) throws JsonIOException, JsonSyntaxException {
        // 创建JsonReader包装Reader
        JsonReader jsonReader = newJsonReader(json);
        
        // 调用核心反序列化方法
        return fromJson(jsonReader, typeOfT);
    }
    
    // 从JSON字符串反序列化为对象(使用Class指定类型)
    public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException {
        if (json == null) {
            return null;
        }
        
        // 创建StringReader读取JSON字符串
        StringReader reader = new StringReader(json);
        
        // 调用核心反序列化方法
        return fromJson(reader, classOfT);
    }
}

4.2 类型适配器的查找与反序列化

反序列化过程中的类型适配器查找逻辑与序列化相同,但具体的反序列化操作由适配器的read()方法实现:

public final class Gson {
    // 从JsonReader读取JSON并反序列化为对象
    public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {
        // ... 前置代码 ...
        
        // 获取类型适配器(与序列化共享同一缓存和查找逻辑)
        TypeAdapter<?> adapter = getAdapter(TypeToken.get(typeOfT));
        
        // 调用适配器的read方法执行反序列化
        T result = (T) adapter.read(reader);
        
        // ... 后置代码 ...
    }
}

4.3 对象反序列化的反射实现

对于普通Java对象,Gson使用ReflectiveTypeAdapter进行反序列化:

public final class ReflectiveTypeAdapterFactory implements TypeAdapterFactory {
    // 反射类型适配器的实现
    static final class Adapter<T> extends TypeAdapter<T> {
        private final ObjectConstructor<T> constructor;
        private final Map<String, BoundField> boundFields;
        
        Adapter(ObjectConstructor<T> constructor, Map<String, BoundField> boundFields) {
            this.constructor = constructor;
            this.boundFields = boundFields;
        }
        
        @Override
        public T read(JsonReader in) throws IOException {
            // 处理JSON为null的情况
            if (in.peek() == JsonToken.NULL) {
                in.nextNull();
                return null;
            }
            
            // 创建对象实例
            T instance = constructor.construct();
            
            try {
                // 开始解析JSON对象
                in.beginObject();
                
                // 遍历JSON对象的所有属性
                while (in.hasNext()) {
                    // 读取属性名
                    String name = in.nextName();
                    
                    // 查找匹配的绑定字段
                    BoundField field = boundFields.get(name);
                    
                    if (field == null || !field.deserialized) {
                        // 没有找到匹配的字段或字段不需要反序列化,跳过
                        in.skipValue();
                    } else {
                        // 读取字段值
                        field.read(in, instance);
                    }
                }
            } catch (IllegalStateException e) {
                throw new JsonSyntaxException(e);
            } catch (IllegalAccessException e) {
                throw new AssertionError(e);
            }
            
            // 结束解析JSON对象
            in.endObject();
            
            return instance;
        }
        
        @Override
        public void write(JsonWriter out, T value) throws IOException {
            // 序列化实现...
        }
    }
    
    // 绑定字段类,封装了字段的序列化和反序列化逻辑
    abstract static class BoundField {
        final String name;
        final boolean serialized;
        final boolean deserialized;
        final boolean isPrimitive;
        
        protected BoundField(String name, boolean serialized, boolean deserialized, boolean isPrimitive) {
            this.name = name;
            this.serialized = serialized;
            this.deserialized = deserialized;
            this.isPrimitive = isPrimitive;
        }
        
        // 检查字段是否应该被序列化
        abstract boolean writeField(Object value) throws IOException, IllegalAccessException;
        
        // 写入字段值
        abstract void write(JsonWriter writer, Object value) throws IOException, IllegalAccessException;
        
        // 读取字段值
        abstract void read(JsonReader reader, Object value) throws IOException, IllegalAccessException;
    }
}

4.4 集合与映射的反序列化

对于集合和映射类型,Gson使用专门的TypeAdapter进行反序列化:

// 集合类型适配器工厂
public final class CollectionTypeAdapterFactory implements TypeAdapterFactory {
    // ... 工厂代码 ...
    
    // 集合类型适配器实现
    private static final class Adapter<E> extends TypeAdapter<Collection<E>> {
        private final TypeAdapter<E> elementTypeAdapter;
        private final ObjectConstructor<? extends Collection<E>> constructor;
        
        @Override
        public Collection<E> read(JsonReader in) throws IOException {
            // 处理JSON为null的情况
            if (in.peek() == JsonToken.NULL) {
                in.nextNull();
                return null;
            }
            
            // 创建集合实例
            Collection<E> collection = constructor.construct();
            
            // 开始解析JSON数组
            in.beginArray();
            
            // 遍历JSON数组的每个元素
            while (in.hasNext()) {
                // 反序列化元素并添加到集合中
                E instance = elementTypeAdapter.read(in);
                collection.add(instance);
            }
            
            // 结束解析JSON数组
            in.endArray();
            
            return collection;
        }
        
        @Override
        public void write(JsonWriter out, Collection<E> collection) throws IOException {
            // 序列化实现...
        }
    }
}

// 映射类型适配器工厂
public final class MapTypeAdapterFactory implements TypeAdapterFactory {
    // ... 工厂代码 ...
    
    // 映射类型适配器实现
    private static final class Adapter<K, V> extends TypeAdapter<Map<K, V>> {
        private final TypeAdapter<K> keyTypeAdapter;
        private final TypeAdapter<V> valueTypeAdapter;
        private final ObjectConstructor<? extends Map<K, V>> constructor;
        
        @Override
        public Map<K, V> read(JsonReader in) throws IOException {
            // 处理JSON为null的情况
            if (in.peek() == JsonToken.NULL) {
                in.nextNull();
                return null;
            }
            
            // 创建映射实例
            Map<K, V> map = constructor.construct();
            
            // 开始解析JSON对象
            in.beginObject();
            
            // 遍历JSON对象的所有属性
            while (in.hasNext()) {
                // 读取属性名(键)
                String keyStr = in.nextName();
                
                // 反序列化键
                K key = keyTypeAdapter.fromJsonTree(new JsonPrimitive(keyStr));
                
                // 反序列化值
                V value = valueTypeAdapter.read(in);
                
                // 将键值对添加到映射中
                map.put(key, value);
            }
            
            // 结束解析JSON对象
            in.endObject();
            
            return map;
        }
        
        @Override
        public void write(JsonWriter out, Map<K, V> map) throws IOException {
            // 序列化实现...
        }
    }
}

五、配置选项的实现与应用

5.1 字段命名策略的实现

Gson提供了多种字段命名策略,通过FieldNamingStrategy接口实现:

// 字段命名策略接口
public interface FieldNamingStrategy {
    // 将Java字段名转换为JSON属性名
    public String translateName(Field f);
}

// 内置的字段命名策略实现
public enum FieldNamingPolicy implements FieldNamingStrategy {
    // 使用字段的原始名称
    IDENTITY {
        @Override
        public String translateName(Field f) {
            return f.getName();
        }
    },
    
    // 将字段名转换为小写,并用下划线分隔
    LOWER_CASE_WITH_UNDERSCORES {
        @Override
        public String translateName(Field f) {
            return separateCamelCase(f.getName(), "_").toLowerCase();
        }
    },
    
    // 将字段名转换为小写,并用连字符分隔
    LOWER_CASE_WITH_DASHES {
        @Override
        public String translateName(Field f) {
            return separateCamelCase(f.getName(), "-").toLowerCase();
        }
    },
    
    // 将字段名转换为大写,并用下划线分隔
    UPPER_CASE_WITH_UNDERSCORES {
        @Override
        public String translateName(Field f) {
            return separateCamelCase(f.getName(), "_").toUpperCase();
        }
    },
    
    // 将字段名的首字母大写
    UPPER_CAMEL_CASE {
        @Override
        public String translateName(Field f) {
            return modifyString(0, f.getName(), Character::toUpperCase);
        }
    },
    
    // 将字段名的首字母大写,并添加前缀
    UPPER_CAMEL_CASE_WITH_SPACES {
        @Override
        public String translateName(Field f) {
            return separateCamelCase(f.getName(), " ");
        }
    };
    
    // 辅助方法:将驼峰命名转换为分隔符命名
    private static String separateCamelCase(String name, String separator) {
        StringBuilder translation = new StringBuilder();
        for (int i = 0; i < name.length(); i++) {
            char character = name.charAt(i);
            if (Character.isUpperCase(character) && translation.length() != 0) {
                translation.append(separator);
            }
            translation.append(character);
        }
        return translation.toString();
    }
    
    // 辅助方法:修改字符串特定位置的字符
    private static String modifyString(int offset, String string, Function<Character, Character> modifier) {
        StringBuilder result = new StringBuilder(string);
        result.setCharAt(offset, modifier.apply(result.charAt(offset)));
        return result.toString();
    }
}

5.2 排除策略的实现

Gson通过ExclusionStrategy接口实现字段和类的排除:

// 排除策略接口
public interface ExclusionStrategy {
    // 是否

Gson通过ExclusionStrategy接口实现字段和类的排除:

// 排除策略接口
public interface ExclusionStrategy {
    // 是否排除指定的类
    boolean shouldSkipClass(Class<?> clazz);
    
    // 是否排除指定的字段
    boolean shouldSkipField(FieldAttributes f);
}

// 字段属性接口,封装了字段的元数据
public interface FieldAttributes {
    // 获取字段名
    String getName();
    
    // 获取字段的声明类型
    Class<?> getDeclaringClass();
    
    // 获取字段的类型
    Class<?> getType();
    
    // 获取字段的泛型类型
    Type getGenericType();
    
    // 检查字段是否有指定的注解
    boolean hasModifier(int modifier);
    
    // 获取字段上的指定注解
    <T extends Annotation> T getAnnotation(Class<T> annotation);
    
    // 检查字段是否有任何注解
    boolean hasAnnotations();
}

// 内置的排除策略实现
class ModifierBasedExclusionStrategy implements ExclusionStrategy {
    private final int modifiers;
    
    public ModifierBasedExclusionStrategy(int modifiers) {
        this.modifiers = modifiers;
    }
    
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        // 检查字段是否有指定的修饰符
        return (f.getModifiers() & modifiers) != 0;
    }
    
    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }
}

// 处理@Expose注解的排除策略
class ExposeAnnotationExclusionStrategy implements ExclusionStrategy {
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        Expose expose = f.getAnnotation(Expose.class);
        return expose == null || (!expose.serialize() && !expose.deserialize());
    }
    
    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }
}

// 处理@Since和@Until注解的版本排除策略
class VersionExclusionStrategy implements ExclusionStrategy {
    private final double version;
    
    public VersionExclusionStrategy(double version) {
        this.version = version;
    }
    
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        Since since = f.getAnnotation(Since.class);
        if (since != null && since.value() > version) {
            return true;
        }
        
        Until until = f.getAnnotation(Until.class);
        return until != null && until.value() <= version;
    }
    
    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        Since since = clazz.getAnnotation(Since.class);
        if (since != null && since.value() > version) {
            return true;
        }
        
        Until until = clazz.getAnnotation(Until.class);
        return until != null && until.value() <= version;
    }
}

5.3 自定义序列化与反序列化器的注册

Gson允许通过registerTypeAdapter()registerTypeHierarchyAdapter()方法注册自定义的序列化器和反序列化器:

public final class GsonBuilder {
    // 注册针对特定类型的适配器
    public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {
        // 验证typeAdapter是否为合法类型
        if (typeAdapter instanceof TypeAdapter) {
            factories.add(TypeAdapters.newFactory(TypeToken.get(type), (TypeAdapter<?>) typeAdapter));
        } else if (typeAdapter instanceof JsonSerializer || typeAdapter instanceof JsonDeserializer) {
            TypeToken<?> typeToken = TypeToken.get(type);
            factories.add(TypeAdapters.newFactoryWithMatchRawType(
                    typeToken,
                    typeAdapter,
                    matchRawType));
        } else {
            throw new IllegalArgumentException("Expected a TypeAdapter, JsonSerializer or JsonDeserializer");
        }
        return this;
    }
    
    // 注册针对类型层次结构的适配器
    public GsonBuilder registerTypeHierarchyAdapter(Class<?> baseType, Object typeAdapter) {
        if (typeAdapter instanceof TypeAdapter) {
            factories.add(TypeAdapters.newTypeHierarchyFactory(baseType, (TypeAdapter<?>) typeAdapter));
        } else if (typeAdapter instanceof JsonSerializer || typeAdapter instanceof JsonDeserializer) {
            factories.add(TypeAdapters.newJsonSerializerDeserializer(
                    baseType,
                    (JsonSerializer<?>) typeAdapter,
                    (JsonDeserializer<?>) typeAdapter));
        } else {
            throw new IllegalArgumentException("Expected a TypeAdapter, JsonSerializer or JsonDeserializer");
        }
        return this;
    }
}

5.4 处理泛型类型的TypeToken机制

由于Java的类型擦除,在运行时无法直接获取泛型的具体类型参数。Gson通过TypeToken类解决这个问题:

// TypeToken类:保存泛型类型信息
public abstract class TypeToken<T> {
    final Type type;
    final Class<? super T> rawType;
    final int hashCode;
    
    // 受保护的构造函数,强制子类通过匿名内部类实现
    protected TypeToken() {
        this.type = getSuperclassTypeParameter(getClass());
        this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
        this.hashCode = type.hashCode();
    }
    
    // 私有构造函数,用于直接创建TypeToken
    private TypeToken(Type type) {
        this.type = $Gson$Types.canonicalize(type);
        this.rawType = (Class<? super T>) $Gson$Types.getRawType(this.type);
        this.hashCode = this.type.hashCode();
    }
    
    // 获取泛型类型信息
    public final Type getType() {
        return type;
    }
    
    // 获取原始类型
    public final Class<? super T> getRawType() {
        return rawType;
    }
    
    // 静态工厂方法,创建TypeToken实例
    public static TypeToken<?> get(Type type) {
        return new TypeToken<Object>(type) {};
    }
    
    // 获取类的泛型父类的类型参数
    static Type getSuperclassTypeParameter(Class<?> subclass) {
        Type superclass = subclass.getGenericSuperclass();
        if (superclass instanceof Class) {
            throw new RuntimeException("Missing type parameter.");
        }
        ParameterizedType parameterized = (ParameterizedType) superclass;
        return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
    }
    
    // 其他方法...
}

5.5 处理日期格式的配置

Gson提供了多种方式配置日期格式:

public final class GsonBuilder {
    // 使用特定的日期格式
    public GsonBuilder setDateFormat(String pattern) {
        this.datePattern = pattern;
        this.dateStyle = null;
        this.timeStyle = null;
        return this;
    }
    
    // 使用特定的日期风格
    public GsonBuilder setDateFormat(int style) {
        this.dateStyle = style;
        this.timeStyle = style;
        this.datePattern = null;
        return this;
    }
    
    // 使用特定的日期和时间风格
    public GsonBuilder setDateFormat(int dateStyle, int timeStyle) {
        this.dateStyle = dateStyle;
        this.timeStyle = timeStyle;
        this.datePattern = null;
        return this;
    }
    
    // 注册自定义的日期适配器
    public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {
        if (type == Date.class) {
            // 处理日期类型的适配器注册
            if (typeAdapter instanceof TypeAdapter) {
                factories.add(TypeAdapters.newFactory(TypeToken.get(type), (TypeAdapter<?>) typeAdapter));
            } else if (typeAdapter instanceof JsonSerializer || typeAdapter instanceof JsonDeserializer) {
                // 处理JsonSerializer和JsonDeserializer
                // ...
            }
        }
        return this;
    }
}

// 内置的日期适配器
class DateTypeAdapter extends TypeAdapter<Date> {
    private final DateFormat enUsFormat;
    private final DateFormat localFormat;
    private final DateFormat iso8601Format;
    
    public DateTypeAdapter() {
        this.enUsFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US);
        this.localFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);
        this.iso8601Format = buildIso8601Format();
    }
    
    private static DateFormat buildIso8601Format() {
        DateFormat iso8601Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
        iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC"));
        return iso8601Format;
    }
    
    @Override
    public Date read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        return deserializeToDate(in.nextString());
    }
    
    private Date deserializeToDate(String json) {
        synchronized (enUsFormat) {
            try {
                // 尝试使用ISO 8601格式解析
                return iso8601Format.parse(json);
            } catch (ParseException e) {
                try {
                    // 尝试使用本地格式解析
                    return localFormat.parse(json);
                } catch (ParseException e2) {
                    try {
                        // 尝试使用US格式解析
                        return enUsFormat.parse(json);
                    } catch (ParseException e3) {
                        throw new JsonSyntaxException(json, e3);
                    }
                }
            }
        }
    }
    
    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        
        synchronized (enUsFormat) {
            // 使用ISO 8601格式序列化
            String dateFormatAsString = iso8601Format.format(value);
            out.value(dateFormatAsString);
        }
    }
}

六、线程安全与性能优化

6.1 Gson实例的线程安全性

Gson实例是不可变的,因此可以安全地在多线程环境中共享:

public final class Gson {
    // 所有配置参数在构造时初始化,之后不可变
    private final List<TypeAdapterFactory> factories;
    private final FieldNamingStrategy fieldNamingStrategy;
    private final LongSerializationPolicy longSerializationPolicy;
    // 其他配置字段...
    
    public Gson(
        List<TypeAdapterFactory> factories,
        FieldNamingStrategy fieldNamingStrategy,
        LongSerializationPolicy longSerializationPolicy,
        // 其他参数...
    ) {
        // 初始化配置字段
        this.factories = factories;
        this.fieldNamingStrategy = fieldNamingStrategy;
        this.longSerializationPolicy = longSerializationPolicy;
        // 初始化其他字段...
    }
    
    // 所有公共方法都是无状态的,不修改Gson实例的内部状态
    public String toJson(Object src) {
        // 序列化实现...
    }
    
    public <T> T fromJson(String json, Class<T> classOfT) {
        // 反序列化实现...
    }
}

6.2 类型适配器的缓存机制

Gson使用ConcurrentHashMap缓存已创建的TypeAdapter,提高性能:

public final class Gson {
    // 类型适配器缓存
    private final ConcurrentMap<TypeToken<?>, TypeAdapter<?>> typeTokenCache = new ConcurrentHashMap<>();
    
    // 获取类型适配器,先检查缓存
    public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
        // 从缓存中查找适配器
        TypeAdapter<?> cached = typeTokenCache.get(type);
        if (cached != null) {
            return (TypeAdapter<T>) cached;
        }
        
        // 缓存未命中时,创建新的适配器并缓存
        TypeAdapter<T> newAdapter = createAdapter(type);
        TypeAdapter<?> previous = typeTokenCache.putIfAbsent(type, newAdapter);
        
        return previous != null ? (TypeAdapter<T>) previous : newAdapter;
    }
    
    // 创建新的类型适配器
    private <T> TypeAdapter<T> createAdapter(TypeToken<T> type) {
        // 遍历工厂列表,查找能够处理该类型的工厂
        for (TypeAdapterFactory factory : factories) {
            TypeAdapter<T> candidate = factory.create(this, type);
            if (candidate != null) {
                return candidate;
            }
        }
        
        // 没有找到合适的工厂,抛出异常
        throw new IllegalArgumentException("Gson cannot handle " + type);
    }
}

6.3 反射性能优化

Gson通过多种方式优化反射性能:

// 构造函数工厂,用于创建对象实例
public final class ConstructorConstructor {
    private final Map<Type, InstanceCreator<?>> instanceCreators;
    
    public ConstructorConstructor(Map<Type, InstanceCreator<?>> instanceCreators) {
        this.instanceCreators = instanceCreators;
    }
    
    // 获取创建指定类型实例的工厂
    public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
        final Type type = typeToken.getType();
        final Class<? super T> rawType = typeToken.getRawType();
        
        // 1. 检查是否有注册的InstanceCreator
        final InstanceCreator<T> typeCreator = (InstanceCreator<T>) instanceCreators.get(type);
        if (typeCreator != null) {
            return () -> typeCreator.createInstance(type);
        }
        
        // 2. 检查是否有注册的原始类型的InstanceCreator
        final InstanceCreator<T> rawTypeCreator = (InstanceCreator<T>) instanceCreators.get(rawType);
        if (rawTypeCreator != null) {
            return () -> rawTypeCreator.createInstance(type);
        }
        
        // 3. 使用反射创建无参构造函数的实例
        ObjectConstructor<T> defaultConstructor = newDefaultConstructor(rawType);
        if (defaultConstructor != null) {
            return defaultConstructor;
        }
        
        // 4. 使用反射创建有参构造函数的实例
        ObjectConstructor<T> defaultImplementation = newDefaultImplementationConstructor(type, rawType);
        if (defaultImplementation != null) {
            return defaultImplementation;
        }
        
        // 5. 使用Unsafe创建实例(性能最优,但需要特殊权限)
        return newUnsafeAllocator(type, rawType);
    }
    
    // 使用反射创建无参构造函数的实例
    private <T> ObjectConstructor<T> newDefaultConstructor(Class<? super T> rawType) {
        try {
            // 获取无参构造函数
            final Constructor<? super T> constructor = rawType.getDeclaredConstructor();
            
            // 检查构造函数的可访问性
            if (!constructor.isAccessible()) {
                constructor.setAccessible(true);
            }
            
            // 返回构造函数工厂
            return () -> {
                try {
                    return (T) constructor.newInstance();
                } catch (InstantiationException e) {
                    throw new RuntimeException("Failed to invoke " + constructor + " with no args", e);
                } catch (InvocationTargetException e) {
                    throw new RuntimeException("Failed to invoke " + constructor + " with no args", e.getTargetException());
                } catch (IllegalAccessException e) {
                    throw new AssertionError(e);
                }
            };
        } catch (NoSuchMethodException e) {
            return null;
        }
    }
    
    // 使用Unsafe创建实例
    private <T> ObjectConstructor<T> newUnsafeAllocator(final Type type, final Class<? super T> rawType) {
        return () -> {
            try {
                // 使用Unsafe.allocateInstance创建实例,不调用构造函数
                return (T) unsafe.allocateInstance(rawType);
            } catch (InstantiationException e) {
                throw new RuntimeException("Unable to create instance of " + type, e);
            }
        };
    }
}

6.4 流式API的性能优势

Gson的流式API(JsonReader和JsonWriter)相比DOM API(JsonObject和JsonArray)具有更好的性能:

// 使用流式API解析JSON
public void parseJsonStream(String json) throws IOException {
    JsonReader reader = new JsonReader(new StringReader(json));
    
    // 开始解析
    reader.beginObject();
    
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("name")) {
            String value = reader.nextString();
            // 处理name字段
        } else if (name.equals("age")) {
            int value = reader.nextInt();
            // 处理age字段
        } else {
            reader.skipValue(); // 跳过不关心的字段
        }
    }
    
    // 结束解析
    reader.endObject();
    reader.close();
}

// 使用流式API生成JSON
public String generateJsonStream() throws IOException {
    StringWriter stringWriter = new StringWriter();
    JsonWriter writer = new JsonWriter(stringWriter);
    
    // 开始生成JSON对象
    writer.beginObject();
    
    // 添加name字段
    writer.name("name").value("John Doe");
    
    // 添加age字段
    writer.name("age").value(30);
    
    // 添加hobbies数组
    writer.name("hobbies").beginArray();
    writer.value("reading");
    writer.value("swimming");
    writer.value("coding");
    writer.endArray();
    
    // 结束生成JSON对象
    writer.endObject();
    writer.close();
    
    return stringWriter.toString();
}

七、与其他框架的集成与扩展

7.1 与Retrofit的集成

Gson与Retrofit的集成通过GsonConverterFactory实现:

// GsonConverterFactory类
public final class GsonConverterFactory extends Converter.Factory {
    private final Gson gson;
    
    private GsonConverterFactory(Gson gson) {
        this.gson = gson;
    }
    
    // 创建GsonConverterFactory实例
    public static GsonConverterFactory create() {
        return create(new Gson());
    }
    
    public static GsonConverterFactory create(Gson gson) {
        return new GsonConverterFactory(gson);
    }
    
    // 创建响应体转换器
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new GsonResponseBodyConverter<>(gson, adapter);
    }
    
    // 创建请求体转换器
    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        return new GsonRequestBodyConverter<>(gson, adapter);
    }
}

// 响应体转换器
final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final Gson gson;
    private final TypeAdapter<T> adapter;
    
    GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }
    
    @Override
    public T convert(ResponseBody value) throws IOException {
        JsonReader jsonReader = gson.newJsonReader(value.charStream());
        try {
            return adapter.read(jsonReader);
        } finally {
            value.close();
        }
    }
}

// 请求体转换器
final class GsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private final MediaType MEDIA_TYPE = MediaType.get("application/json; charset=UTF-8");
    private final Charset UTF_8 = Charset.forName("UTF-8");
    
    private final Gson gson;
    private final TypeAdapter<T> adapter;
    
    GsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }
    
    @Override
    public RequestBody convert(T value) throws IOException {
        Buffer buffer = new Buffer();
        Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
        JsonWriter jsonWriter = gson.newJsonWriter(writer);
        adapter.write(jsonWriter, value);
        jsonWriter.close();
        return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
    }
}

7.2 与Room数据库的集成

Gson可用于Room数据库中处理复杂数据类型的序列化和反序列化:

// 自定义TypeConverter类
public class Converters {
    private static Gson gson = new Gson();
    
    // 将List<String>转换为JSON字符串
    @TypeConverter
    public static String fromStringList(List<String> list) {
        return gson.toJson(list);
    }
    
    // 将JSON字符串转换为List<String>
    @TypeConverter
    public static List<String> toStringList(String json) {
        Type type = new TypeToken<List<String>>() {}.getType();
        return gson.fromJson(json, type);
    }
    
    // 将自定义对象转换为JSON字符串
    @TypeConverter
    public static String fromUser(User user) {
        return gson.toJson(user);
    }
    
    // 将JSON字符串转换为自定义对象
    @TypeConverter
    public static User toUser(String json) {
        return gson.fromJson(json, User.class);
    }
}

// 在Room数据库中注册TypeConverter
@Database(entities = {Note.class}, version = 1)
@TypeConverters(Converters.class)
public abstract class AppDatabase extends RoomDatabase {
    public abstract NoteDao noteDao();
}

7.3 自定义TypeAdapterFactory的实现

通过实现自定义的TypeAdapterFactory,可以实现更灵活的类型适配:

// 自定义TypeAdapterFactory
public class CustomTypeAdapterFactory implements TypeAdapterFactory {
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        // 处理特定类型
        if (type.getRawType() == Date.class) {
            return (TypeAdapter<T>) new CustomDateTypeAdapter();
        }
        
        // 处理集合类型
        if (Collection.class.isAssignableFrom(type.getRawType())) {
            Type elementType = $Gson$Types.getCollectionElementType(type.getType(), type.getRawType());
            TypeAdapter<?> elementAdapter = gson.getAdapter(TypeToken.get(elementType));
            
            return (TypeAdapter<T>) new CustomCollectionTypeAdapter(gson, elementType, elementAdapter);
        }
        
        // 其他类型使用默认适配器
        return null;
    }
}

// 自定义Date类型适配器
class CustomDateTypeAdapter extends TypeAdapter<Date> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    
    @Override
    public Date read(JsonReader in) throws IOException {
        String dateStr = in.nextString();
        try {
            return dateFormat.parse(dateStr);
        } catch (ParseException e) {
            throw new JsonSyntaxException(e);
        }
    }
    
    @Override
    public void write(JsonWriter out, Date date) throws IOException {
        if (date == null) {
            out.nullValue();
            return;
        }
        out.value(dateFormat.format(date));
    }
}

// 自定义集合类型适配器
class CustomCollectionTypeAdapter<E> extends TypeAdapter<Collection<E>> {
    private final TypeAdapter<E> elementAdapter;
    
    public CustomCollectionTypeAdapter(Gson gson, Type elementType, TypeAdapter<E> elementAdapter) {
        this.elementAdapter = elementAdapter;
    }
    
    @Override
    public Collection<E> read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        
        Collection<E> collection = new ArrayList<>();
        in.beginArray();
        
        while (in.hasNext()) {
            E element = elementAdapter.read(in);
            collection.add(element);
        }
        
        in.endArray();
        return collection;
    }
    
    @Override
    public void write(JsonWriter out, Collection<E> collection) throws IOException {
        if (collection == null) {
            out.nullValue();
            return;
        }
        
        out.beginArray();
        for (E element : collection) {
            elementAdapter.write(out, element);
        }
        out.endArray();
    }
}

八、常见问题与最佳实践

8.1 处理循环引用

当对象图中存在循环引用时,直接序列化会导致栈溢出异常。Gson提供了两种解决方案:

// 方法一:使用@Expose注解排除循环引用字段
public class Parent {
    private String name;
    
    @Expose(serialize = false, deserialize = false)
    private Child child;
    
    // getter和setter方法
}

public class Child {
    private String name;
    
    @Expose(serialize = false, deserialize = false)
    private Parent parent;
    
    // getter和setter方法
}

// 方法二:自定义TypeAdapter处理循环引用
public class ParentTypeAdapter extends TypeAdapter<Parent> {
    private final Map<Parent, Boolean> serialized = new IdentityHashMap<>();
    
    @Override
    public void write(JsonWriter out, Parent parent) throws IOException {
        if (parent == null) {
            out.nullValue();
            return;
        }
        
        // 检查是否已序列化,避免循环引用
        if (serialized.containsKey(parent)) {
            out.beginObject();
            out.name("id").value(System.identityHashCode(parent));
            out.endObject();
            return;
        }
        
        // 标记为已序列化
        serialized.put(parent, true);
        
        out.beginObject();
        out.name("name").value(parent.getName());
        
        // 递归序列化child,但不处理其parent字段
        out.name("child");
        new ChildTypeAdapter(serialized).write(out, parent.getChild());
        
        out.endObject();
    }
    
    @Override
    public Parent read(JsonReader in) throws IOException {
        // 反序列化实现...
    }
}

public class ChildTypeAdapter extends TypeAdapter<Child> {
    private final Map<Parent, Boolean> serialized;
    
    public ChildTypeAdapter(Map<Parent, Boolean> serialized) {
        this.serialized = serialized;
    }
    
    @Override
    public void write(JsonWriter out, Child child) throws IOException {
        if (child == null) {
            out.nullValue();
            return;
        }
        
        out.beginObject();
        out.name("name").value(child.getName());
        
        // 不序列化parent字段,避免循环引用
        // out.name("parent");
        // parentTypeAdapter.write(out, child.getParent());
        
        out.endObject();
    }
    
    @Override
    public Child read(JsonReader in) throws IOException {
        // 反序列化实现...
    }
}

8.2 处理泛型类型

由于Java的类型擦除,在反序列化泛型类型时需要使用TypeToken:

// 错误的方式(无法正确反序列化泛型类型)
List<String> list = gson.fromJson(json, List.class); // 会丢失泛型信息

// 正确的方式(使用TypeToken保留泛型信息)
TypeToken<List<String>> typeToken = new TypeToken<List<String>>() {};
List<String> list = gson.fromJson(json, typeToken.getType());

// 处理复杂泛型类型
TypeToken<Map<String, List<Integer>>> typeToken = new TypeToken<Map<String, List<Integer>>>() {};
Map<String, List<Integer>> map = gson.fromJson(json, typeToken.getType());

// 在方法中使用TypeToken
public <T> T fromJson(String json, TypeToken<T> typeToken) {
    return gson.fromJson(json, typeToken.getType());
}

// 使用示例
List<String> list = fromJson(json, new TypeToken<List<String>>() {});

8.3 处理多态类型

当需要序列化和反序列化多态类型时,需要额外的类型信息:

// 基类
public abstract class Shape {
    private String type;
    
    public Shape(String type) {
        this.type = type;
    }
    
    public String getType() {
        return type;
    }
    
    // 抽象方法
    public abstract double area();
}

// 子类
public class Circle extends Shape {
    private double radius;
    
    public Circle(double radius) {
        super("circle");
        this.radius = radius;
    }
    
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
    
    public double getRadius() {
        return radius;
    }
}

public class Rectangle extends Shape {
    private double width;
    private double height;
    
    public Rectangle(double width, double height) {
        super("rectangle");
        this.width = width;
        this.height = height;
    }
    
    @Override
    public double area() {
        return width * height;
    }
    
    public double getWidth() {
        return width;
    }
    
    public double getHeight() {
        return height;
    }
}

// 自定义TypeAdapter处理多态类型
public class ShapeTypeAdapter extends TypeAdapter<Shape> {
    private static final String TYPE_FIELD = "type";
    
    @Override
    public void write(JsonWriter out, Shape shape) throws IOException {
        if (shape == null) {
            out.nullValue();
            return;
        }
        
        out.beginObject();
        out.name(TYPE_FIELD).value(shape.getType());
        
        if (shape instanceof Circle) {
            Circle circle = (Circle) shape;
            out.name("radius").value(circle.getRadius());
        } else if (shape instanceof Rectangle) {
            Rectangle rectangle = (Rectangle) shape;
            out.name("width").value(rectangle.getWidth());
            out.name("height").value(rectangle.getHeight());
        }
        
        out.endObject();
    }
    
    @Override
    public Shape read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        
        String type = null;
        double radius = 0;
        double width = 0;
        double height = 0;
        
        in.beginObject();
        
        while (in.hasNext()) {
            String name = in.nextName();
            
            switch (name) {
                case TYPE_FIELD:
                    type = in.nextString();
                    break;
                case "radius":
                    radius = in.nextDouble();
                    break;
                case "width":
                    width = in.nextDouble();
                    break;
                case "height":
                    height = in.nextDouble();
                    break;
                default:
                    in.skipValue();
            }
        }
        
        in.endObject();
        
        if ("circle".equals(type)) {
            return new Circle(radius);
        } else if ("rectangle".equals(type)) {
            return new Rectangle(width, height);
        } else {
            throw new JsonSyntaxException("Unknown shape type: " + type);
        }
    }
}

// 注册自定义TypeAdapter
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Shape.class, new ShapeTypeAdapter())
    .create();

// 使用示例
Shape circle = new Circle(5.0);
String json = gson.toJson(circle);

Shape shape = gson.fromJson(json, Shape.class);
System.out.println("Area: " + shape.area());

8.4 性能优化最佳实践

以下是使用Gson时的性能优化建议:

  1. 复用Gson实例:Gson实例创建开销较大,应在应用中共享单例实例
public class GsonUtils {
    private static final Gson GSON = new GsonBuilder()
        .setPrettyPrinting()
        .create();
    
    public static Gson getInstance() {
        return GSON;
    }
}
  1. 使用自定义TypeAdapter:对于频繁序列化/反序列化的类型,使用自定义TypeAdapter避免反射开销
class UserTypeAdapter extends TypeAdapter<User> {
    @Override
    public void write(JsonWriter out, User user) throws IOException {
        out.beginObject();
        out.name("name").value(user.getName());
        out.name("age").value(user.getAge());
        out.endObject();
    }
    
    @Override
    public User read(JsonReader in) throws IOException {
        String name = null;
        int age = 0;
        
        in.beginObject();
        while (in.hasNext()) {
            String jsonName = in.nextName();
            switch (jsonName) {
                case "name":
                    name = in.nextString();
                    break;
                case "age":
                    age = in.nextInt();
                    break;
                default:
                    in.skipValue();
            }
        }
        in.endObject();
        
        return new User(name, age);
    }
}
  1. 避免序列化不必要的字段:使用@Expose注解或自定义排除策略
public class User {
    private String name;
    private int age;
    
    @Expose(serialize = false)
    private String password;
    
    // getter和setter方法
}

// 配置Gson只处理带@Expose注解的字段
Gson gson = new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .create();
  1. 使用流式API处理大型JSON:对于大型JSON数据,使用JsonReader和JsonWriter的流式API避免内存溢出
// 读取大型JSON文件
try (JsonReader reader = new JsonReader(new FileReader("large_data.json"))) {
    reader.beginArray();
    while (reader.hasNext()) {
        // 逐行处理JSON元素
        processElement(reader);
    }
    reader.endArray();
} catch (IOException e) {
    e.printStackTrace();
}
  1. 启用JIT优化:在Android环境中,确保应用已启用JIT编译以提高反射性能
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

九、总结与展望

9.1 Gson的优势与局限

9.1.1 主要优势
  1. 简单易用:提供简洁的API,降低了JSON处理的复杂度
  2. 强大的类型支持:能够处理复杂的Java对象图,包括泛型、集合和多态
  3. 高度可定制:通过自定义TypeAdapter和TypeAdapterFactory,可以灵活处理各种特殊情况
  4. 广泛的集成:与Retrofit、Room等主流Android框架无缝集成
  5. 性能优化:通过缓存机制和多种优化策略,提供了良好的性能表现
  6. 社区活跃:作为Google的开源项目,得到了持续的维护和广泛的社区支持
9.1.2 主要局限
  1. 反射开销:对于大量数据的序列化和反序列化,反射机制会带来一定的性能开销
  2. 泛型类型擦除:由于Java的类型擦除,处理复杂泛型类型时需要额外的TypeToken机制
  3. 学习曲线:对于复杂的自定义序列化和反序列化需求,需要深入理解Gson的内部机制
  4. 不支持非标准JSON:严格遵循JSON规范,对于一些非标准JSON格式的支持有限
  5. 内存占用:在处理大型JSON数据时,DOM方式可能导致较高的内存占用

9.2 未来发展趋势

9.2.1 性能优化方向
  1. 减少反射依赖:通过代码生成技术(如Annotation Processor)减少运行时反射的使用
  2. 支持GraalVM:优化在GraalVM等原生编译环境下的性能表现
  3. 流式处理增强:进一步优化流式API的性能,提供更高效的大型JSON处理能力
9.2.2 功能增强方向
  1. Kotlin协程支持:提供对Kotlin协程的原生支持,简化异步JSON处理
  2. 更丰富的注解支持:引入更多注解,提供更灵活的序列化和反序列化控制
  3. 多格式支持:扩展支持其他数据格式,如Protocol Buffers、CBOR等
  4. 模块化设计:采用模块化设计,允许用户只引入需要的功能模块
9.2.3 生态融合方向
  1. 与Android Jetpack深度集成:与Data Binding、ViewModel等