经过XStream将XML转Bean中使用泛型的一点疑惑
通过XStream将XML转Bean中使用泛型的一点疑惑
今天在做XMl转为Bean的实例,遇到一个奇怪的问题,出代码先:
//工具类:
@SuppressWarnings("unchecked")
public Object readXml2Bean(String xml,Class rootClazz,Class headClazz,Class detailClazz){
try {
xstream.alias("Root",rootClazz);
xstream.alias("Head",headClazz);
xstream.alias("Detail",detailClazz);
return xstream.fromXML(xml);
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
//Head节点用泛型
public class PackRoot<T,M> {
private T Head;
public List<M> Detail_List;
//getter/setter方法略
}
//Head节点用具体类型声明
public class PackRoot<M> {
private PackHead Head;
public List<M> Detail_List;
//getter/setter方法略
}
//测试用例:
File file =new File("D:\\2001.xml");
BufferedReader bf =new BufferedReader(new FileReader(file));
StringBuilder sb=new StringBuilder();
String temp=null;
while((temp=bf.readLine())!=null){
sb.append(temp);
}
Object root=XMl2BeanUtil.getInstance().readXml2Bean(sb.toString(),PackRoot.class, PackHead.class,PackDetail.class);
if(root==null){
System.out.println("解析报文出错[xml]="+sb.toString());
}
PackRoot<PackHead,PackDetail> rt=(PackRoot<PackHead,PackDetail>)root;
PackHead head=rt.getHead();
List<PackDetail> details=rt.getDetail_List();
System.out.println("head="+head);
System.out.println("details="+details);
for(PackDetail detail:details){
System.out.println(detail);
}
报文结构:
<Root>
<Head>
......
</Head>
<Detail_List>
<Detail>
......
</Detail>
<Detail>
......
</Detail>
</Detail_List>
</Root>
场景:
由于业务需求的报文头部(Head)和详情(Detail)里面节点内容不同,所以立马想到,在定义PackRoot时,通过泛型来该Head和Detail进行声明Head和Detail。
问题:
1:将Head和Detail都声明为泛型,代码见PackRoot(Head节点用泛型)! 就无法识别Head下面的子节点(错误如图);但是Detail是可以识别且得到对应子节点内容。
但是,将Head使用具体类型声明,Detail使用泛型声明,Head和Detail都能被解析。
不知道具体是什么原因?想不通!期待各位大侠高见,不吝赐教!!!
今天在做XMl转为Bean的实例,遇到一个奇怪的问题,出代码先:
//工具类:
@SuppressWarnings("unchecked")
public Object readXml2Bean(String xml,Class rootClazz,Class headClazz,Class detailClazz){
try {
xstream.alias("Root",rootClazz);
xstream.alias("Head",headClazz);
xstream.alias("Detail",detailClazz);
return xstream.fromXML(xml);
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
//Head节点用泛型
public class PackRoot<T,M> {
private T Head;
public List<M> Detail_List;
//getter/setter方法略
}
//Head节点用具体类型声明
public class PackRoot<M> {
private PackHead Head;
public List<M> Detail_List;
//getter/setter方法略
}
//测试用例:
File file =new File("D:\\2001.xml");
BufferedReader bf =new BufferedReader(new FileReader(file));
StringBuilder sb=new StringBuilder();
String temp=null;
while((temp=bf.readLine())!=null){
sb.append(temp);
}
Object root=XMl2BeanUtil.getInstance().readXml2Bean(sb.toString(),PackRoot.class, PackHead.class,PackDetail.class);
if(root==null){
System.out.println("解析报文出错[xml]="+sb.toString());
}
PackRoot<PackHead,PackDetail> rt=(PackRoot<PackHead,PackDetail>)root;
PackHead head=rt.getHead();
List<PackDetail> details=rt.getDetail_List();
System.out.println("head="+head);
System.out.println("details="+details);
for(PackDetail detail:details){
System.out.println(detail);
}
报文结构:
<Root>
<Head>
......
</Head>
<Detail_List>
<Detail>
......
</Detail>
<Detail>
......
</Detail>
</Detail_List>
</Root>
场景:
由于业务需求的报文头部(Head)和详情(Detail)里面节点内容不同,所以立马想到,在定义PackRoot时,通过泛型来该Head和Detail进行声明Head和Detail。
问题:
1:将Head和Detail都声明为泛型,代码见PackRoot(Head节点用泛型)! 就无法识别Head下面的子节点(错误如图);但是Detail是可以识别且得到对应子节点内容。
但是,将Head使用具体类型声明,Detail使用泛型声明,Head和Detail都能被解析。
不知道具体是什么原因?想不通!期待各位大侠高见,不吝赐教!!!