1、XStream引入和使用參考
[參考: XML和Java對象互轉實現(XStream方式) - 不無聊 - 博客園 https://www.cnblogs.com/buwuliao/p/15813878.html#/ ]
2、XStream對於List對象的使用
2.1 實體類
2.1.1 MyBeanXStreamXml
package com.MyModel;
import java.util.List;
public class MyBeanXStreamXml {
private String name;
private String id;
private String age;
private List<MyBeanItemXStreamXml> itemList;
//省略get set方法
2.1.2 MyBeanItemXStreamXml
package com.MyModel;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("ROW")
public class MyBeanItemXStreamXml {
private String nameItem;
private String id;
private String age;
//省略get set方法
}
2.2 Demo
注意點: xStreamForStr.autodetectAnnotations(true);
有了這行代碼之后,MyBeanItemXStreamXml類中的@XStreamAlias("ROW") 注解才會生效,不然會報錯
package com.TestArch;
import com.MyModel.MyBeanItemXStreamXml;
import com.MyModel.MyBeanXStreamXml;
import com.alibaba.fastjson.JSON;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.security.AnyTypePermission;
import lombok.SneakyThrows;
import java.util.ArrayList;
import java.util.List;
public class TestXMLByXStream {
@SneakyThrows
public static void main(String args[]) {
//1、構建對象
List<MyBeanItemXStreamXml> xmls = new ArrayList<>();
MyBeanItemXStreamXml itemXStreamXml= new MyBeanItemXStreamXml();
itemXStreamXml.setNameItem("nameItem");
itemXStreamXml.setId("idItem");
itemXStreamXml.setAge("ageItem");
xmls.add(itemXStreamXml);
MyBeanItemXStreamXml itemXStreamXml2= new MyBeanItemXStreamXml();
itemXStreamXml2.setNameItem("nameItem2");
itemXStreamXml2.setId("idItem2");
itemXStreamXml2.setAge("ageItem2");
xmls.add(itemXStreamXml2);
MyBeanXStreamXml myBeanXml = new MyBeanXStreamXml();
myBeanXml.setAge("28");
myBeanXml.setId("01");
myBeanXml.setName("PHC");
myBeanXml.setItemList(xmls);
// 2、對象轉 XML System.out.println("----------對象轉 XML-------------------");
XStream xStream = new XStream();
xStream.autodetectAnnotations(true);
String xml = xStream.toXML(myBeanXml);
System.out.println(xml);
// 3、對象轉 XML:修改根節點標識
System.out.println("----------對象轉 XML:修改根節點標識-------------------");
xStream.alias("ROOT", MyBeanXStreamXml.class); // 修改根節點標識
String xml2 = xStream.toXML(myBeanXml);
System.out.println(xml2);
// 4、XML 字符串轉對象
System.out.println("----------XML 字符串轉對象-------------------");
XStream xStreamForStr = new XStream();
xStreamForStr.autodetectAnnotations(true);
xStreamForStr.addPermission(AnyTypePermission.ANY); //沒有這行會報錯:com.thoughtworks.xstream.security.ForbiddenClassException
MyBeanXStreamXml person2 = (MyBeanXStreamXml) xStreamForStr.fromXML(xml);
System.out.println("" + JSON.toJSONString(person2));
}
}
3、附:XStream注解(@XStreamAlias)不生效的報錯以及解決:
3.1 報錯解決:
原因是:要想使用XStream的注解,必須開啟注解掃描。[參考: 要想使用XStream的注解,必須開啟注解掃描._boss_way的博客-CSDN博客_xstream 注解沒生效 https://blog.csdn.net/boss_way/article/details/78488296#/ ]
解決:xStreamForStr.autodetectAnnotations(true); 添加這行代碼即可,具體見Demo
3.2 報錯信息
com.thoughtworks.xstream.converters.ConversionException:
---- Debugging information ----
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message : ROW
class : java.util.ArrayList
required-type : java.util.ArrayList
converter-type : com.thoughtworks.xstream.converters.collections.CollectionConverter
path : /com.dmall.pay.channel.rpc.dto.vendor.VendorTransactionDetailQueryRpcResponse/LIST/ROW
line number : 1
class[1] : com.dmall.pay.channel.rpc.dto.vendor.VendorTransactionDetailQueryRpcResponse
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
version : 1.4.9
-------------------------------
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:503)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:429)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:281)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1230)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1214)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1085)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1076)
at com.dmall.pay.channel.rpc.util.Utils.getObjectFromXML(Utils.java:101)
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.getResObj(SeparatePayRpcServiceImplTest.java:447)
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.vendorTransactionDetailQuery(SeparatePayRpcServiceImplTest.java:303)
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.main(SeparatePayRpcServiceImplTest.java:610)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: ROW
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:72)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:98)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:91)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:85)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:80)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
... 19 more
java.lang.RuntimeException
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.getResObj(SeparatePayRpcServiceImplTest.java:451)
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.vendorTransactionDetailQuery(SeparatePayRpcServiceImplTest.java:303)
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.main(SeparatePayRpcServiceImplTest.java:610)
Exception in thread "main" java.lang.RuntimeException
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.vendorTransactionDetailQuery(SeparatePayRpcServiceImplTest.java:310)
at com.dmall.pay.channel.rpc.impl.SeparatePayRpcServiceImplTest.main(SeparatePayRpcServiceImplTest.java:610)