作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。
上一节咱们遗留下一个问题,就是当我们需要保存多个对象到 xml 中时怎么处理?当然我们也可以在对象中存入集合,但是毕竟不是多个对象,而是对象中存多个元素.那使用 XStream如何处理呢?请看 XStream 对象流API
API
XStream 在针对存储多个对象的操作提供了java.io.ObjectInputStream,java.io.ObjectOutputStream对象流的转化操作.
xStream对象.createObjectOutputStream(new FileOutputStream(file));
xStream对象.createObjectInputStream(new FileInputStream(file));
看到 API 后相信很多人已经知道了怎么去书写了.接下来上代码.
实践出真知
模型
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@XStreamAlias("student") // 设置生成标签名
public class Student {
private String name;
private Integer age;
}
接下来就把多个对象存到 xml 中
@Test
public void testObj2xml() throws Exception {
XStream xStream = new XStream(new StaxDriver());
// 自动解析注解
xStream.autodetectAnnotations(true);
// 获取对象输出流
ObjectOutputStream objOs = xStream.createObjectOutputStream(new FileOutputStream(new File("obj.xml")));
// 写入对象
objOs.writeObject(new Student("stef",17));
objOs.writeObject(new Student("will",17));
objOs.writeObject(new Student("willie",18));
objOs.close();
}
接下来看下生成的xml
<?xml version="1.0" ?>
<object-stream>
<student>
<name>stef</name>
<age>18</age>
</student>
<student>
<name>will</name>
<age>18</age>
</student>
<student>
<name>willie</name>
<age>18</age>
</student>
</object-stream>
以上咱们就把多个对象存到了 xml 中,接下来就是从 xml 中去读取对象了
@Test
public void testXml2obj() throws Exception {
XStream xStream = new XStream(new StaxDriver());
// 解析注解
xStream.processAnnotations(Student.class);
// 获取对象输入流
ObjectInputStream objIs = xStream.createObjectInputStream(new FileInputStream(new File("obj.xml")));
// 写入对象
System.out.println((Student)objIs.readObject());
System.out.println((Student)objIs.readObject());
System.out.println((Student)objIs.readObject());
objIs.close();
}
控制台
Student(name=stef, age=18)
Student(name=will, age=18)
Student(name=willie, age=18)
以上咱们就把 xml 中的对象给读取出来了,看到这个,其实用心的你会发现,目前咱们存入了3个对象,读取也只能读3遍,如果读第4个就会出错,如果想做到通用,也就是读归读,写归写,不被存入对象的个数限制,那这个怎么处理呢?请看怎么判断对象流已经读取到末尾.
读到这里,有想法的你可能会有这样的疑问,目前咱们都是用 XStrem 默认的解析方式来处理对象和 xml 的装换,如果咱们有比较特殊的需求咋办?能否由咱们自己来定制解析规则?答案是肯定的,请看下一节,XStream 自定义转换器.