我想我明白你的问题。您想要序列化一个
Foo<T>,并且
T在运行时具有class对象(但在编译时不是固定的)。因此,在Gson中建议的创建匿名子类的解决方案
TypeToken不起作用,因为这要求
Foo<String>在编译时对参数化类型(例如)进行硬编码,并且如果使用,则该解决方案不起作用
Foo<T>。
但是,让我们看一下
TypeTokenGson网站上的方法实际完成的工作。您创建一个对象的匿名子类的对象
TypeToken,然后使用其
getType()方法请求其类型参数。类的超类是其元数据的一部分,并且包括其超类的通用参数。因此,在运行时,它可以查看自己的继承层次结构,并弄清楚您使用的类型参数是什么
TypeToken,然后返回
java.lang.reflect.Type该类型的实例(如果已参数化,它将是一个
ParameterizedType实例)。一旦获得此
Type实例,就应该将其作为的第二个参数传递
toGson()。
我们需要做的就是找到另一种方法来创建该实例
ParameterizedType。
ParameterizedType是一个接口,但不幸的是,公共Java
API没有提供任何具体的实现方式或任何
ParameterizedType动态创建方式。
ParameterizedTypeImpl在私有Sun
API和您可以使用的Gson代码中似乎有一个名为的类(例如,在此处)。您可以简单地复制代码并将其重命名为您自己的类。然后,要创建一个在运行时
Type表示的对象
Foo<String>,您可以执行类似
newParameterizedTypeImpl(Foo.class, new Type[]{String.class}, null)(未测试)的操作


