【问题标题】:XStream canConvert issue for paramterised generics参数化泛型的 XStream canConvert 问题
【发布时间】:2011-04-12 02:20:54
【问题描述】:

我有一个要求,我必须编写一个自定义 XStream MapConverter,它只转换特定类型的地图。举个例子,我希望我的自定义转换器只使用 Map(String, Date) 地图。我需要通过覆盖 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 方法中解决此问题的更好方法吗?

【问题讨论】:

    标签: generics serialization xstream


    【解决方案1】:

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

    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 的自定义实现。

    【讨论】:

    • 这被简单地扩展为支持空映射,但您可能会遇到异构映射的问题(即代码假设映射中的所有值都是相同的类型,这可能不是真的)。
    • 我认为这里提到的代码行不通,因为 canConvert() 方法中唯一可用的参数是类名。 XStream框架调用该方法时,无法访问数据,只能访问类类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-11-06
    • 2015-03-29
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多