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

4

问题在于每次执行主方法时,a.xml文件的旧内容都会丢失,并被新内容替换。如何将内容附加到a.xml文件中而不丢失先前的信息?

import java.io.FileNotFoundException;
import java.io.PrintWriter;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;


public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        XStream xs = new XStream(new DomDriver());
        Foo f = new Foo(1, "booo", new Bar(42));
        PrintWriter pw = new PrintWriter("a.xml");
        xs.toXML(f,pw);
    }
}


public class Bar {
    public int id;

    public Bar(int id) {
        this.id = id;
    }

}


public class Foo {
    public int a;
    public String b;
    public Bar boo;
    public Foo(int a, String b, Bar c) {
        this.a = a;
        this.b = b;
        this.boo = c;
    }
}
2个回答

3
问题是,您真的想将序列化的XML字符串附加到文件中,还是想将新的Foo实例添加到XML结构中。

基于字符串的附加将导致无效的XML,就像这样:

<foo>
  <a>1</a>
  <b>booo</b>
  <bar>
    <id>42</id>
  </bar>
</foo>
<foo>
  <a>1</a>
  <b>booo</b>
  <bar>
    <id>42</id>
  </bar>
</foo>

相反,您可能希望首先解析a.xml中的数据,然后添加新元素并序列化整个集合/数组以保留数据。

因此,假设a.xml中已经有一个Foo集合,可以像这样操作:

List foos = xs.fromXml(...);
foos.add(new Foo(1, "booo", new Bar(42)));
xs.toXml(foos, pw);

...这将会给你类似于以下的东西:

<foos>
  <foo>
    <a>1</a>
    <b>booo</b>
    <bar>
      <id>42</id>
    </bar>
  </foo>
  <foo>
    <a>1</a>
    <b>booo</b>
    <bar>
      <id>42</id>
    </bar>
  </foo>
</foos>

HTH


是的,那正是我想做的。但如果文件是空的呢?那么 List foos = xs.fromXML(...) 就不会有效 :? - brain_damage
你需要处理一些特殊情况,这是真的。但是根据XStream,你要么会得到一个异常,要么会得到null,然后你可以捕获或检查并从那里继续进行。 - Martin Klinke
1
是的,这是一种方法。然而,为了达到保存的目的而加载和保存所有内容可能会是一项相当繁琐的任务。 - user238033

2

示例代码

public static void main(String a[]){
  //Other code omitted
  FileOutputStream fos = new FileOutputStream("c:\\yourfile",true); //true specifies append
  Foo f = new Foo(1, "booo", new Bar(42));
  xs.toXML(f,fos);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接