标签: xstream

XStream短动态别名

我希望有类的短名称,现在我可以用别名来做

XStream x = new XStream();
x.alias("dic", Dic.class);
Run Code Online (Sandbox Code Playgroud)

但我必须为每个类手动定义别名,有没有办法配置xstream自动执行?

java automation alias dynamic xstream

4
推荐指数
2
解决办法
4026
查看次数

优化xstream的加载速度

当我尝试从XML文件执行加载时,我觉得xstream加载速度达不到我的要求.对于具有10k ++条目的"数据库",将需要几分钟.

以下是我用于序列化的整个数据结构.列表的大小(符号和代码)大约是10k ++条目.

http://jstock.cvs.sourceforge.net/viewvc/jstock/jstock/src/org/yccheok/jstock/engine/StockCodeAndSymbolDatabase.java?revision=1.11&view=markup

有什么方法我可以尝试,看看它是否会加快我的加载时间?能够仍然加载以前保存的文件也很重要.

以下是用于反序列化的代码.谢谢.

@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)

java xstream

4
推荐指数
1
解决办法
4015
查看次数

如何使用XStream有条件地序列化字段(属性)

我正在使用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有条件地序列化字段?

xstream xml-serialization

4
推荐指数
1
解决办法
1532
查看次数

如何重命名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>).

java xstream xml-serialization

4
推荐指数
1
解决办法
4292
查看次数

为什么Apache Camel中这个简单的JSON编组示例不起作用?

我花了很长时间试图解决这个问题.我正在编写一个接收用户名和密码的服务.然后,它使用处理器生成一个身份验证令牌,该令牌在消息的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)

java xstream apache-camel unmarshalling

4
推荐指数
1
解决办法
7796
查看次数

XStream隐式集合配置问题

我正在使用生成此类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类型可能有两个容器,一个用于猫,一个用于狗:

<farm>
  <cat>Garfield</cat>
  <cat>Arlene</cat>
  <cat>Nermal</cat>
  <dog>Odie</dog>
</farm>
Run Code Online (Sandbox Code Playgroud)

但是,这个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.

java xml xstream

4
推荐指数
1
解决办法
8884
查看次数

将 XML 转换为嵌套映射的映射

我有一个带有嵌套元素和重复标签的 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。

java xml spring xstream jaxb

4
推荐指数
1
解决办法
4298
查看次数

无法使用gradle将xstream 1.4.8依赖项添加到Android

我在将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)

android xstream gradle android-gradle-plugin

4
推荐指数
1
解决办法
2936
查看次数

通过Xstream进行变量初始化

请考虑以下声明作为其中一部分 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)

我得到一个NPErd.getBlah()

当我,而不是初步初始化,将初始化放置到的构造函数 SomeClass

public SomeClass() {
  blah = new HashSet<String>();
}
Run Code Online (Sandbox Code Playgroud)

同样的问题 - NPErd.getBlah()

当我修改getter以首先检查null时,它可以工作,但..

public Set<String> getBlah() {
   if (blah == null)
      return new HashSet<Sgring>();
   return blah;
}
Run Code Online (Sandbox Code Playgroud)

我很困惑...为什么不XStream初始化变量以及是否需要延迟实例化?

java xstream

3
推荐指数
1
解决办法
1679
查看次数

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)

java xml xstream xml-parsing

3
推荐指数
2
解决办法
5945
查看次数