XStream序列化与反序列化对象

XStream是一个将java对象序列化为xml以及从xml反序列化为java对象的开源类库。

使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。
和其他序列化工具相比,XStream 有三个突出的特点:
[list]
[*]XStream 不关心序列化/逆序列化的类的字段的可见性。
[*]序列化/逆序列化类的字段不需要 getter 和 setter 方法。
[*]序列化/逆序列化的类不需要有默认构造函数。
[/list]
不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。

简单示例部分代码:

public static void xstreamTest(PackerInfo packerInfo, String path)
throws DocumentException, FileNotFoundException {
File file = new File(path);
System.out.println(file.getAbsolutePath());
FileOutputStream fos = new FileOutputStream(file);
XStream xstream = new XStream();
//XStream xStream = new XStream(new DomDriver());//不需要XPP3库
// 禁止使用引用标识某元素,形如:./../../element
xstream.setMode(XStream.NO_REFERENCES);
// 注册别名,缩减元素名称,将com.nightjar.bean.PackerInfo简化为parkerInfo表示
xstream.alias("parkerInfo", com.nightjar.bean.PackerInfo.class);
xstream.alias("recordInfo", com.nightjar.bean.RecordInfo.class);
// 解决Map<String,Object> 时key用String表示
xstream.alias("recordId", String.class);
FileInputStream fis = new FileInputStream(file);
// 从xml文件反序列化对象
xstream.toXML(packerInfo, fos);
// 将对象持久序列化至xml文件
if (!file.exists() || 0 >= file.length()) {
// avoid input contained no data
xstream.toXML(new PackerInfo(), fos);
}
xstream.fromXML(fis, packerInfo);
}




public class PackerInfo {

private Map<String, RecordInfo> recordMap = new HashMap<String, RecordInfo>();
//@XStreamOmitField 忽略该属性
private String routerClass;
private String packerPath;
private String packerResult;

}

public class RecordInfo {
private String versionId;
private VersionInfo version;
private String supportRainer;
private String supportOffical;
private String market;
private String productClass;
private String deviceClass;
private String pafIni;
private String lisenceIni;
private String softDescIni;
private String packerIni;
// 标识此条记录是否使能:enable,disable
private String status;
}

public class VersionInfo {
private String v;
private String r;
private String c;
private String b;
private String d;
private String sp;
private String spc;
private String spcd;
private String smk;
}


运行结果示例:
<parkerInfo>
<recordMap>
<entry>
<recordId>1234561111</recordId>
<recordInfo>
<versionId>1234561111</versionId>
<version>
<v>600</v>
<r>003</r>
<c>05</c>
<b>30</b>
<d>0</d>
<sp></sp>
<spc>10</spc>
<spcd>0</spcd>
<smk>T</smk>
</version>
<supportRainer></supportRainer>
<supportOffical></supportOffical>
<market>oc</market>
<productClass>CX</productClass>
<deviceClass>X8X16</deviceClass>
<pafIni>pafIni</pafIni>
<lisenceIni>lisenceIni</lisenceIni>
<softDescIni>softDescIni</softDescIni>
<packerIni>packerIni</packerIni>
<status>enable</status>
</recordInfo>
</entry>
</recordMap>
<routerClass>NE40E</routerClass>
<packerPath>D:/AT/packer</packerPath>
<packerResult>D:/AT/Result</packerResult>
</parkerInfo>


setMode是设置相同的对象的引用方式,如果设置XStream.NO_REFERENCES就是不引用,会输出2分相同的Student元素。如果是XStream.ID_REFERENCES会引用相同的那个对象的id属性,如果是XStream.XPATH_ABSOLUTE_REFERENCES引用,那么它将显示xpath路径。上面采用的id引用,<student reference="3"/>这个引用了id=3的那个student标签元素;
useAttributeFor是设置某个节点显示到父节点的属性中,也就是将指定class中的指定属性,在这个class元素节点的属性中显示。
如:
<student><name>hoojo</name></student>

设置好后就是这样的结果:
<student name=”hoojo”></student>

aliasAttribute是修改属性名称。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值