Generics 参数化泛型的XStream canConvert问题

Generics 参数化泛型的XStream canConvert问题,generics,serialization,xstream,Generics,Serialization,Xstream,我需要编写一个定制的XStream MapConverter,它只转换特定类型的映射。举个例子,我希望我的自定义转换器只处理映射(字符串、日期)映射。我需要通过重写canConvert方法来实现这一点。到目前为止,这是我写的canConvert方法: @Override public boolean canConvert(Class clazz) { return (!clazz.equals(Object.class) && Map.class.isAssign

我需要编写一个定制的XStream MapConverter,它只转换特定类型的映射。举个例子,我希望我的自定义转换器只处理映射(字符串、日期)映射。我需要通过重写canConvert方法来实现这一点。到目前为止,这是我写的canConvert方法:

@Override  
public boolean canConvert(Class clazz) {  
    return (!clazz.equals(Object.class) && Map.class.isAssignableFrom(clazz));  
}  
但这适用于所有类型的地图。由于“java.lang.Class”不公开任何提供参数类型信息的方法,因此对于泛型集合,我无法在canConvert方法中实现所需的结果


我可以考虑的一个解决方法是围绕Map(String,Date)创建一个虚拟包装器类,并使用它来实现canConvert方法。是否有人能在canConvert方法中提出更好的解决此问题的方法?

在这里,泛型不能做很多事情,因为它们在运行时不存在。您可以尝试获取第一个键和条目值并检查它们的类型。这显然不适用于空贴图,但如果贴图为空,则可能不需要对其进行任何转换

Map<String, Date> m = new HashMap<String, Date>();
m.put("test", new Date());
Object key = m.keySet().iterator().next();
Object value = m.get(key);

System.out.println(key.getClass().isAssignableFrom(String.class));
System.out.println(value.getClass().isAssignableFrom(Date.class));
Map m=newhashmap();
m、 放置(“测试”,新日期());
对象键=m.keySet().iterator().next();
对象值=m.get(键);
System.out.println(key.getClass().isAssignableFrom(String.class));
System.out.println(value.getClass().isAssignableFrom(Date.class));

除此之外,正如您所说,您几乎必须创建自己的包装器类或推出一个只接受字符串键和日期值的Map的自定义实现。

这是一个简单的扩展,以支持空映射,但您可能会遇到异构映射的问题(即,代码假定映射中的所有值都是相同类型的,这可能不是真的)。我认为这里提到的代码不起作用,因为canConvert()方法中唯一可用的参数是类名。当XStream framework调用此方法时,无法访问数据,只能访问类类型。