XStream序列化与反序列化对象

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

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

不需要修改类,使用 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是修改属性名称。

你可能感兴趣的:(java,xml,Serializable,xstream)