我目前正在研究一个使用通用类型适配器库的序列化例程。如果要序列化的对象是我拥有的特定适配器之一的实例,那么我需要在执行其他序列化过程之前在对象上调用该适配器。
以下代码有效:
private final static String serialize(Object obj, Map<Class<?>,
XmlAdapter<?,?>> classToAdapterMap) throws JAXBException
{
Object adaptedObj = null;
for (Class<?> clazz : classToAdapterMap.keySet()) {
if (clazz.isInstance(obj)) {
XmlAdapter<?,?> adapter = classToAdapterMap.get(clazz);
Class<?>[] argTypes = new Class[] {clazz};
try {
Method method = adapter.getClass().getMethod("marshal", argTypes);
adaptedObj = method.invoke(adapter, obj);
break;
} catch (Exception e) {
// handle method retrieval and invocation related exceptions
}
}
}
// serialize
}
但是,我最初认为我可以更简单地执行此操作,例如使用如下代码:
/* DOES NOT WORK */
private final static String serialize(Object obj, Map<Class<?>,
XmlAdapter<?,?>> classToAdapterMap) throws JAXBException
{
Object adaptedObj = null;
for (Class<?> clazz : classToAdapterMap.keySet()) {
if (clazz.isInstance(obj)) {
XmlAdapter<?,?> adapter = classToAdapterMap.get(clazz);
adaptedObj = adapter.marshal(clazz.cast(obj));
break;
}
}
// serialize
}
显然,问题在于通配符通用类型适配器不能保证处理 type 的对象clazz
。但是,我不能通过将方法签名(我可能会这样做)更改为 来表明这两个是相同的private final static <T> String serialize(Object obj, Map<Class<T>, XmlAdapter<?,T>> classToAdapterMap)
,因为映射需要保存所有不同类型的适配器。
有什么更好的方法来做到这一点?还是我应该坚持使用基于反射的解决方案?
提前致谢,
-担