Gson通过借助TypeToken获取泛型参数的类型的方法详解编程语言

转载|

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下。

由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。

但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手。

class Foo<T> { 
T value; 
} 
Gson gson = new Gson(); 
Foo<Bar> foo = new Foo<Bar>(); 
gson.toJson(foo); // May not serialize foo.value correctly 
 
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar

 对于上面的类Foo<T>,由于在运行期间无法得知T的具体类型,对这个类的对象进行序列化和反序列化都不能正常进行。Gson通过借助TypeToken类来解决这个问题。

TestGeneric<String> t = new TestGeneric<String>(); 
t.setValue("Alo"); 
Type type = new TypeToken<TestGeneric<String>>(){}.getType(); 
 
String gStr = GsonUtils.gson.toJson(t,type); 
System.out.println(gStr); 
TestGeneric t1 = GsonUtils.gson.fromJson(gStr, type); 
System.out.println(t1.getValue());

TypeToken的使用非常简单,如上面的代码,只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/15936.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论