我只是想知道如何使用XMLEncoder来序列化ArrayList<foo>,其中foo是我自己创建的类。
我是否需要做一些特别的事情,比如首先定义我自己的xml结构,然后对列表中的每个值调用toString并将其写出来?
有没有人能给我一个好的教程?http://java.sun.com/products/jfc/tsc/articles/persistence4/这就是我一直在看的,但它似乎没有提到如何处理非库类。
谢谢
发布于 2011-01-05 16:52:38
如果您正在寻找XML序列化,我建议您使用XStream。
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));
String xml = xstream.toXML(joe);
<person>
<firstname>Joe</firstname>
<lastname>Walnes</lastname>
<phone>
<code>123</code>
<number>1234-456</number>
</phone>
<fax>
<code>123</code>
<number>9999-999</number>
</fax>
</person>发布于 2011-01-05 17:47:55
使用XMLEncoder序列化ArrayList没有什么特别之处。
下面是一个示例:
有一个bean类TestBean:
public class TestBean {
private String name;
private int age;
public TestBean() {
this.name = "";
this.age = 0;
}
public TestBean(String name, int age) {
this.name = name;
this.age = age;
}
// Getter and setter ...
@Override
public String toString() {
return String.format("[TestBean: name='%s', age=%d]", name, age);
}
}和一个Main类,它序列化一个ArrayList<TestBean>并再次读回它:
public class Main {
private static final String FILENAME = "testbeanlist.xml";
public static void main(String[] args) {
try {
// Create a list of TestBean objects ...
final List<TestBean> list = new ArrayList<TestBean>();
list.add(new TestBean("Henry", 42));
list.add(new TestBean("Tom", 11));
System.out.println("Writing list to file " + FILENAME + ": " + list);
// ... and serialize it via XMLEncoder to file testbeanlist.xml
final XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
new FileOutputStream(FILENAME)));
encoder.writeObject(list);
encoder.close();
// Use XMLDecoder to read the same XML file in.
final XMLDecoder decoder = new XMLDecoder(new FileInputStream(FILENAME));
final List<TestBean> listFromFile = (List<TestBean>) decoder.readObject();
decoder.close();
System.out.println("Reading list: " + listFromFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}然后输出是:
Writing list to file testbeanlist.xml: [[TestBean: name='Henry', age=42], [TestBean: name='Tom', age=11]]
Reading list: [[TestBean: name='Henry', age=42], [TestBean: name='Tom', age=11]]TestBean中的toString()方法只用于漂亮的打印。它不会影响XML序列化。
发布于 2012-08-08 09:03:15
XMLEncoder可以用于任何类,包括用户定义的类-您提到的文章确实详细介绍了如何做到这一点,但它编写得不是很好,所以可能有点难以理解。
如果您的用户定义类遵循JavaBeans spec,那么您可以只使用encoder.writeObject()来序列化List<Foo>实例。这是因为XML输出只是关于如何在运行时重新创建给定实例的一系列指令。默认PersistenceDelegate知道如何序列化列表结构,但只有未知类的默认行为。默认情况下,它试图通过调用其空(无参数)构造函数来重新创建给定的对象实例,然后将其属性逐个设置为给定实例的值-如果该类是JavaBean,则保证可以做到这一点。
如果你的类有一些属性是只读的,即它们是由构造函数设置的,并且在构造时间之后不能改变,那么你必须(稍微)做更多的事情才能让它工作。您可以创建一个DefaultPersistenceDelegate的自定义实例,它可以识别您的类,并知道如何将适当的数据传递给它的构造函数-您只需将属性的名称作为列表传递给它,它就会完成其余的工作:
PersistenceDelegate fooDelegate = new DefaultPersistenceDelegate(new String[] {"propertyName1", "propertyName2"});
encoder.setPersistenceDelegate(Foo.class, fooDelegate);如果您的类的构造函数参数不能通过getter方法直接映射到属性,并且/或者在恢复对象状态时存在其他复杂性,您通常可以通过扩展PersistenceDelegate并自己实现必要的行为来解决这些问题。但是,如果您的类在运行时重新创建非常复杂,并且您希望将其序列化,您应该认真考虑重新设计它以降低其复杂性-这将使整个过程变得更容易,并将极大地减少出错的机会,以及使其更容易在未来更改和扩展。
https://stackoverflow.com/questions/4602210
复制相似问题