我希望有类的短名称,现在我可以用别名来做
XStream x = new XStream();
x.alias("dic", Dic.class);
Run Code Online (Sandbox Code Playgroud)
但我必须为每个类手动定义别名,有没有办法配置xstream自动执行?
当我尝试从XML文件执行加载时,我觉得xstream加载速度达不到我的要求.对于具有10k ++条目的"数据库",将需要几分钟.
以下是我用于序列化的整个数据结构.列表的大小(符号和代码)大约是10k ++条目.
有什么方法我可以尝试,看看它是否会加快我的加载时间?能够仍然加载以前保存的文件也很重要.
以下是用于反序列化的代码.谢谢.
@SuppressWarnings("unchecked")
public static <A> A fromXML(Class c, File file) {
XStream xStream = new XStream(new DomDriver("UTF-8"));
InputStream inputStream = null;
try {
inputStream = new java.io.FileInputStream(file);
Object object = xStream.fromXML(inputStream);
if (c.isInstance(object)) {
return (A)object;
}
}
catch (Exception exp) {
log.error(null, exp);
}
finally {
if (false == close(inputStream)) {
return null;
}
inputStream = null;
}
return null;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用XStream来序列化和反序列化对象.例如,一个名为的类Rating定义如下:
Public Class Rating {
String id;
int score;
int confidence;
// constructors here...
}
Run Code Online (Sandbox Code Playgroud)
但是,在此类中,变量confidence是可选的.
因此,当置信度值(非0)时,Rating对象的XML表示应如下所示:
<rating>
<id>0123</id>
<score>5</score>
<confidence>10</confidence>
</rating>
Run Code Online (Sandbox Code Playgroud)
但是,当置信度未知(默认值为0)时,应从XML表示中省略置信属性:
<rating>
<id>0123</id>
<score>5</score>
</rating>
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何使用XStream有条件地序列化字段?
我的模型看起来像:
@XStreamAlias("article")
class Article {
List<String> tags;
List<String> categories;
}
Run Code Online (Sandbox Code Playgroud)
XStream序列化为XML,如下所示:
<article>
<tags>
<string>foo</string>
</tags>
<categories>
<string>bar</string>
</categories>
</article>
Run Code Online (Sandbox Code Playgroud)
我的问题是如何让这个<string>foo</string>成为<tag>foo<tag>和<string>bar</string>变<category>bar</category>?我无法更改模型的结构,因为我使用Morphia ODM来创建文章实例(文章必须包含List<String>).
我花了很长时间试图解决这个问题.我正在编写一个接收用户名和密码的服务.然后,它使用处理器生成一个身份验证令牌,该令牌在消息的Out部分中返回.我想接受JSON格式的参数,并尝试让类型转换正常工作.我把问题简化为一个独立的单元测试,如下所示:
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.dataformat.JsonDataFormat;
import org.apache.camel.model.dataformat.JsonLibrary;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import com.thoughtworks.xstream.annotations.XStreamAlias;
public class BasicJsonMarshallingTest extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
final Processor simpleProcessor = new Processor() {
@Override public void process(Exchange exchange) throws Exception {
SimpleBean bean = exchange.getIn().getBody(SimpleBean.class);
if(bean == null){
return;
}
exchange.getOut().setBody("a=" + bean.getA() + " b=" + bean.getB());
}
};
return new RouteBuilder() {
@Override public void configure() throws Exception {
JsonDataFormat jsonFormat = new JsonDataFormat(JsonLibrary.XStream); …Run Code Online (Sandbox Code Playgroud) 我正在使用生成此类XML的系统:
<address>
<addressLine>123 Main Street</addressLine>
<addressLine>Suite 123</addressLine>
<city>Test City</city>
<stateOrProvince>AA</stateOrProvince>
<postalCode>00000</postalCode>
</address>
Run Code Online (Sandbox Code Playgroud)
两个addressLine元素应该是XStream隐式集合的一部分 - 我想调用一个getAddressLine()方法并获得一个List<String>输出.
我一直在使用XStream的教程,并且还没有弄清楚如何addressLine正确地映射元素.在XStream的Tweaking Output教程中有类似的用例,但没有提供示例代码:
另一个用例是集合,数组和映射.如果某个类的字段是这些类型之一,则默认情况下,其所有元素都嵌入在表示容器对象本身的元素中.通过与配置XStream的
XStream.addImplicitCollection(),XStream.addImplicitArray()以及XStream.addImplicitMap()方法,能够直接作为类的儿童和用于容器对象周围标签保持元件被省略.甚至可以为类声明多个隐式集合,数组或映射,但是必须可以区分这些元素以在反序列化时正确填充不同的容器.在以下示例中,表示服务器场的Java类型可能有两个容器,一个用于猫,一个用于狗:
Run Code Online (Sandbox Code Playgroud)<farm> <cat>Garfield</cat> <cat>Arlene</cat> <cat>Nermal</cat> <dog>Odie</dog> </farm>
但是,这个SO答案表明XStream场示例是不可能的.
我已经尝试过这个Java代码对我的Java代码进行单元测试,但还没有运气:
XStream xstream = new XStream(new StaxDriver());
xstream.alias("address", Address.class);
xstream.alias("addressLine", String.class);
xstream.addImplicitCollection(Address.class, "addressLines");
Address address = (Address) xstream.fromXML(
new FileInputStream("src/test/resources/addressTest.xml"));
Run Code Online (Sandbox Code Playgroud)
我应该尝试其他任何配置更改吗?
注意:我目前正在使用XStream v1.2.2.
我有一个带有嵌套元素和重复标签的 XML。例如:
<person>
<name>Rama</name>
<age>27</age>
<gender>male</gender>
<address>
<doornumber>234</doornumber>
<street>Kanon</street>
<city>Hyderabad</city>
</address>
<qualification>
<degree>M.Sc</degree>
<specialisation>Maths</specialisation>
</qualification>
<qualification>
<degree>B.E.</degree>
<specialisation>Electrical</specialisation>
</qualification>
</person>
Run Code Online (Sandbox Code Playgroud)
现在我想要一个 API 可以将此 XML 转换为 Java 中的地图:
{name="Rama",age="27",gender="male",address={doornumber=234,street="Kanon",city="Hyderabad"},qualification=[{degree="M.Sc",specialisation="Maths"},{degree="B.E.",specialisation="Electrical"}]}
Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用 XStream API 来实现这一点。这里我只是想知道使用 XStream 是否有任何缺点以及是否存在其他更好的 Java API 来实现这一点。有什么建议么?
注意:这应该以通用方式完成,即 Java API 应该适用于任何 XML,而不仅仅是上述 XML。
我在将xstream库包含到基于Android gradle的应用程序时遇到了困难.从我在xstream文档中读到的内容来看,它应该"开箱即用".但是,当我添加依赖项时:
compile 'com.thoughtworks.xstream:xstream:1.4.8'
我在构建过程中遇到以下异常:
* What went wrong:
Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: org/xmlpull/v1/XmlPullParser.class
Run Code Online (Sandbox Code Playgroud)
好吧,也许我应该排除xmlpull?我尝试将此依赖项更改为:
compile ('com.thoughtworks.xstream:xstream:1.4.8') {
exclude group: 'xmlpull', module: 'xmlpull'
}
Run Code Online (Sandbox Code Playgroud)
结果,一段时间后:
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Exception parsing classes
at com.android.dx.command.dexer.Main.processClass(Main.java:752)
// ...
Caused by: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
// ...
1 error; aborting
Run Code Online (Sandbox Code Playgroud)
我还使用了检查项目依赖项gradle dependencies,但没有发现与xml相关的内容.
我的整个build.gradle档案:
group 'myGroup'
version '1.0'
apply plugin: 'com.android.application'
buildscript {
repositories {
jcenter()
mavenCentral() …Run Code Online (Sandbox Code Playgroud) 请考虑以下声明作为其中一部分 SomeClass
private Set<String> blah = new HashSet<String>();
Run Code Online (Sandbox Code Playgroud)
在课堂上制作,这是后来的
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
StringBuilder json = new StringBuilder(xstream.toXML(SomeClass));
rd = (SomeClass) xstream.fromXML(json.toString());
Run Code Online (Sandbox Code Playgroud)
当我 @Test
assertTrue(rd.getBlah().size() == 0);
Run Code Online (Sandbox Code Playgroud)
我得到一个NPE上rd.getBlah()
当我,而不是初步初始化,将初始化放置到的构造函数 SomeClass
public SomeClass() {
blah = new HashSet<String>();
}
Run Code Online (Sandbox Code Playgroud)
同样的问题 - NPE开rd.getBlah()
当我修改getter以首先检查null时,它可以工作,但..
public Set<String> getBlah() {
if (blah == null)
return new HashSet<Sgring>();
return blah;
}
Run Code Online (Sandbox Code Playgroud)
我很困惑...为什么不XStream初始化变量以及是否需要延迟实例化?
<staging>
<stage>
<name>aaaa</name>
<taskName>aa</taskName>
<taskName>qwqwse</taskName>
<taskName>qwe</taskName>
<iconName>asdad</iconName>
<iconName>dasd</iconName>
</stage>
<stage>
<name>dasda</name>
<taskName>asdak</taskName>
<taskName>dasdk1</taskName>
<taskName>dasdask2</taskName>
<iconName>dasdn</iconName>
<iconName>dasdcon</iconName>
</stage>
</staging>
Run Code Online (Sandbox Code Playgroud)
这是我的java类:
@XStreamAlias("stage")
public class Stage {
private String name;
private List<String> taskName;
private List<String> iconName;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用XStream 1.4.2将该XML数据转换为Java对象.
我见过几个SO帖子,但它仍然没有解决我的问题.
抛出以下异常:
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field taskName
---- Debugging information ----
field : taskName
class : com.thbs.soaconnect.model.configuration.Stage
required-type : com.thbs.soaconnect.model.configuration.Stage
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path : /soaConnect/staging/stage/taskName[2]
line number : 28
class[1] : java.util.ArrayList
converter-type[1] : com.thoughtworks.xstream.converters.collections.CollectionConverter
class[2] : com.thbs.soaconnect.model.configuration.Configuration
version : null
Run Code Online (Sandbox Code Playgroud)
我之前尝试过以下方式:
xstream.addImplicitCollection(Stage.class,"taskName", String.class); …Run Code Online (Sandbox Code Playgroud) xstream ×10
java ×8
xml ×3
alias ×1
android ×1
apache-camel ×1
automation ×1
dynamic ×1
gradle ×1
jaxb ×1
spring ×1
xml-parsing ×1