`
cjc
  • 浏览: 683358 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用XStream需注意的问题

阅读更多

这些问题是我在实际工作中遇到的,遇到一个问题就记一个问题,因为我这人脑子不太好,过段时间就会想不起来怎么解决了。

(一) 类的继承关系,在转化为xml时,父类节点应添加class属性,指明当前是哪个子类继承了它,否则在由xml转化为Object时会出错,因为XStream并不知道该把当前节点实例化为哪种类型。

(1)一个抽象类 Animal.java

packagexml_chb;

publicabstractclassAnimal...{
privateintage;

publicintgetAge()...{
returnage;
}


publicvoidsetAge(intage)...{
this.age=age;
}

}

(2) Pig继承自Animal

packagexml_chb;

publicclassPigextendsAnimal...{
privateintweight;

publicintgetWeight()...{
returnweight;
}


publicvoidsetWeight(intweight)...{
this.weight=weight;
}

}

(3) AnimalContor类中包含Animal类型的变量

packagexml_chb;

publicclassAnimalContor...{
privateStringid;
privateAnimalanimal;
publicAnimalgetAnimal()...{
returnanimal;
}

publicvoidsetAnimal(Animalanimal)...{
this.animal=animal;
}

publicStringgetId()...{
returnid;
}

publicvoidsetId(Stringid)...{
this.id=id;
}


}

(4) 将AnimalContor对象转化为xml

//实例化一个AnimalContor对象
AnimalContorac=newAnimalContor();
ac.setId(
"0001");

//生成Pig对象,并作为AnimalContor的Animal变量实例
Pigpig=newPig();
pig.setAge(
10);
pig.setWeight(
100);
ac.setAnimal(pig);

//将对象转化为xml
XStreamxstream=newXStream(newDomDriver());
xstream.alias(
"animalcontor",AnimalContor.class);
Stringstrxml
=xstream.toXML(ac);
System.out.println(strxml);

输出:

<animalcontor>
<id>0001</id>
<animalclass="xml_chb.Pig">
<weight>100</weight>
<age>10</age>
</animal>
</animalcontor>

注意,animal节点有class属性,表明当前类由哪个子类来实现

(5) 将xml转化为AnimalContor对象

animal节点有class属性

Stringstr1="<animalcontor><id>0002</id><animalclass='xml_chb.Pig'><weight>100</weight><age>11</age></animal></animalcontor>";
AnimalContorac1
=(AnimalContor)xstream.fromXML(str1);
System.out.println(ac1.getId());

输出:0002

animal节点没有class属性,会抛出异常

Stringstr2="<animalcontor><id>0003</id><animal><weight>100</weight><age>11</age></animal></animalcontor>";
AnimalContorac2
=(AnimalContor)xstream.fromXML(str2);
System.out.println(ac2.getId());

抛出如下异常:

java.lang.InstantiationError: xml_chb.Animal
at sun.reflect.GeneratedSerializationConstructorAccessor3.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
at com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider.newInstance(Sun14ReflectionProvider.java:54)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:223)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:117)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:182)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:159)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:118)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:117)
at com.thoughtworks.xstream.core.ReferenceByXPathMarshallingStrategy.unmarshal(ReferenceByXPathMarshallingStrategy.java:29)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:826)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:813)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:761)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:753)
at xml_chb.AnimalContor.main(AnimalContor.java:41)
Exception in thread "main"

分享到:
评论
1 楼 lancezhcj 2011-08-16  
呵呵,楼主谦虚了,不过还是很好的习惯,谢谢你的分享

相关推荐

    使用XStream解析MXL文件用到的jar包---xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar

    在这个场景中,我们关注的是如何使用XStream库来解析MXL(可能是XML的误拼)文件,以及所需的依赖jar包。 首先,让我们了解XStream的核心功能。XStream通过创建一个映射,将Java对象的实例和XML元素之间建立关系。...

    xstream-1.3.1.zip

    需要注意的是,虽然XStream提供了便捷的序列化和反序列化功能,但在处理敏感数据时,应确保遵循安全最佳实践,如使用安全模式和黑名单来防止代码注入。 总之,XStream 1.3.1是一个强大且灵活的工具,能够帮助开发者...

    Xstream 相关jar包

    Xstream是一款轻量级、高性能的Java库,用于将Java对象序列化为XML,反之亦然。这个库因其简单易用的API和高度灵活性而受到许多开发者青睐。...使用Xstream时,务必注意安全性和性能优化,以确保应用的稳定性和安全性。

    XStream解析XML实例

    在Android开发中,XStream同样适用,但需要注意的是,由于Android的安全限制,不能直接使用`XStream`的默认实现。可以使用如`Xpp3Driver`这样的安全驱动来替代: ```java xstream = new XStream(new Xpp3Driver());...

    使用XStream是实现XML与Java对象的转换(5)--Object Stream

    然而,需要注意的是,虽然XStream简化了XML序列化的过程,但如果不妥善处理,可能会导致安全问题,比如XML注入攻击。因此,使用时应确保启用安全模式并配置适当的黑名单。 总之,XStream是一个强大且易于使用的工具...

    xstream-1.4.9实现xml与对象互转

    XStream 是一个强大的 Java 库,它允许程序员将 Java...尽管如此,使用时应注意安全问题,尤其是反序列化过程中可能存在的安全漏洞。理解 XStream 的基本用法和高级特性,可以帮助你在实际开发中更有效地利用这一工具。

    android XMl 解析神奇xstream 一

    在使用XStream时,我们还需要关注一些最佳实践。例如,为了提高性能和减少内存消耗,可以启用DOM(文档对象模型)模式,这样XStream将在内存中只保留一个XML文档的副本。另外,为了确保代码的安全性,应当对XStream...

    xstream.jar及其他依赖jar包

    "xstream.jar及其他依赖jar包"是解决这一问题的重要工具,它包括了xstream-1.4.10.jar、xpp3-1.1.4c.jar和xmlpull_1_0_5.jar这三个文件。这些jar包提供了全面的Java对象到XML以及XML到Java对象的转换功能,简化了...

    XStream 1.4.11 jar包

    3. **类型安全**:XStream 在反序列化时会检查 XML 数据是否符合预期的 Java 类型,从而提供了类型安全的转换,避免了潜在的安全问题。 4. **简洁的 XML 输出**:XStream 生成的 XML 输出非常整洁,易于阅读。同时...

    Xstream生产xml和解析xml

    在使用XStream时,需注意处理特殊字符和常量字段。例如,别名中使用下划线`_`时,转换后的XML中可能会出现`__`的情况,为了避免这类问题,建议使用连字符`-`代替。同时,对于类中的常量,如果不希望它们在XML中生成...

    XStream.zip

    注意,XStream默认生成的XML不包含XML声明(`&lt;?xml version="1.0" encoding="utf-8"?&gt;`)。如果要在生成的XML文件开头添加XML声明,可以使用`XStream.createXMLStreamWriter()`方法,或者在创建`XStream`实例时指定`...

    XStream转换

    在本文中,我们将深入探讨XStream的工作原理、如何使用它来实现bean到XML、XML到bean以及XML到JSON的转换,并给出相关示例。 首先,让我们了解XStream的基本概念。XStream的核心功能是通过反射机制将Java对象转换为...

    xStream-1.31 jar包

    然而,需要注意的是,尽管xStream提供了强大的功能,但在某些安全场景下可能需要额外的考虑。因为xStream默认信任输入数据,这可能导致潜在的安全风险,如XML注入攻击。因此,生产环境中使用xStream时,应确保开启...

    xStream转换xml和json源码

    尽管xStream轻量且易于使用,但在处理不受信任的输入时需要注意安全问题。默认情况下,xStream允许任何类被反序列化,这可能导致安全漏洞。为避免此风险,你应该配置xStream以只允许白名单类的反序列化。 总的来说...

    使用 XStream 把 Java 对象序列化为 XML

    在提供的压缩包中,`sample.xml`可能是使用XStream序列化后的Java对象示例,而`src`目录可能包含了相关的Java源代码,供学习和参考。通过研究这些文件,你可以更深入地理解XStream的工作原理和使用方式。

    json XStream

    值得注意的是,虽然XStream与Jettison结合可以处理JSON,但在某些情况下,专门针对JSON的库如Jackson或Gson可能更适合,因为它们提供了更丰富的功能和更好的性能。然而,如果你的项目已经使用了XStream并且需要处理...

    XStream示例(含jar包)

    在转换过程中,XStream 使用了反射和类型安全的转换规则来确保对象和 XML 之间的准确映射。 **XStream 的使用步骤** 1. **引入依赖**:在 Java 项目中,你需要添加 XStream 相关的 jar 包,如 `xstream-1.4.7.jar`...

    xstream.rar

    然而,需要注意的是,如果不进行适当的安全配置,XStream可能会引发安全问题,因为它默认信任XML输入。因此,在生产环境中,应禁用自动类型探测并使用白名单来限制可序列化的类。 总的来说,"xstream.rar"提供的...

    xstream142和xpp3.zip

    压缩包中的`说明.txt`文件可能包含了这两个库的使用指南、注意事项以及可能的版本更新信息。而`xstream`和`xpp3`这两个文件夹可能包含了库的源代码,便于开发者深入理解其工作原理,或者进行自定义扩展。 总之,`...

    xstream 1.3.1.jar bean对象转换为xml

    **使用XStream进行Bean到XML转换的步骤:** 1. **引入库**:首先,你需要在项目中引入XStream库,这可以通过添加对应的jar文件(如xstream-1.3.1.jar)或者在Maven或Gradle等构建工具中配置依赖完成。 2. **创建...

Global site tag (gtag.js) - Google Analytics