在csFramWork里面,由于需要通过 read()和write() 方法来收发信息。
在传递参数时,我们可以传递一个Map,将它转换成gson字符串,作为一个NetMessage类的mess成员,再将NetMessage类转换成字符串进行传递。而在另一端,我们就需要进行解析,那么解析成Map时,就会出现问题。因为java中存在泛型擦除机制。
做个测试:
public class Test {
public static void main(String[] args) {
Gson gson = new GsonBuilder().create();
// Complex类是一个复数类,由real 和 vir两个成员
List<Complex> list = new ArrayList<Complex>();
// 给list增加一个元素
list.add(new Complex(3.4,7.2));·
// 转换成Gson字符串
String result = gson.toJson(list);
@SuppressWarnings("unchecked")
// 再传换成List类;
List<Complex> otherList = gson.fromJson(result, List.class);
for (Complex one : otherList) {
System.out.println(one);
}
}
}
上述结果为:
由此可见,java的泛型擦除机制会导致我们解析的失败。所以,我们需要做一套工具来避免java的泛型擦除机制所带来的问题。
直接看代码:
public class ArgumentMaker {
private static final Gson gson = new GsonBuilder().create();
private static final Type type = new TypeToken<Map<String , String>>() {}.getType();
private static Map<String, String> actionMap;
public ArgumentMaker() {
actionMap = new HashMap<String, String>();
}
// 先将Gson字符串转换成Map类型。
public ArgumentMaker(String str) {
actionMap = gson.fromJson(str, type);
}
// 将一个action字符串作为键,放到一个Map里面
public ArgumentMaker addAction(String action,Object object) {
// 将对象的Gson字符串作为值
actionMap.put(action, gson.toJson(object));
return this;
}
// 将一个Gson字符串,转换成给定类型的对象
@SuppressWarnings("unchecked")
public <T> T getObject(String name,Class<?> klass) {
String value = actionMap.get(name);
return (T) gson.fromJson(value, klass);
}
// 方法的重载
@SuppressWarnings("unchecked")
public <T> T getObject(String name,Type type) {
String value = actionMap.get(name);
return (T) gson.fromJson(value, type);
}
@Override
public String toString() {
// 将Map传换成Gson字符串
return gson.toJson(actionMap);
}
}
在这里,因为我是为了在csFrameWork里面解决传参问题,所以解决的是Map类的泛型擦除机制问题,如果想解决List类的泛型擦除机制,只需要将Map变为List即可。