首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于序列化的java中的XMLEncoder

用于序列化的java中的XMLEncoder
EN

Stack Overflow用户
提问于 2011-01-05 16:49:50
回答 4查看 27.7K关注 0票数 5

我只是想知道如何使用XMLEncoder来序列化ArrayList<foo>,其中foo是我自己创建的类。

我是否需要做一些特别的事情,比如首先定义我自己的xml结构,然后对列表中的每个值调用toString并将其写出来?

有没有人能给我一个好的教程?http://java.sun.com/products/jfc/tsc/articles/persistence4/这就是我一直在看的,但它似乎没有提到如何处理非库类。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-05 16:52:38

如果您正在寻找XML序列化,我建议您使用XStream

代码语言:javascript
复制
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>
票数 10
EN

Stack Overflow用户

发布于 2011-01-05 17:47:55

使用XMLEncoder序列化ArrayList没有什么特别之处。

下面是一个示例:

有一个bean类TestBean:

代码语言:javascript
复制
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>并再次读回它:

代码语言:javascript
复制
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();
    }
  }
}

然后输出是:

代码语言:javascript
复制
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序列化。

票数 10
EN

Stack Overflow用户

发布于 2012-08-08 09:03:15

XMLEncoder可以用于任何类,包括用户定义的类-您提到的文章确实详细介绍了如何做到这一点,但它编写得不是很好,所以可能有点难以理解。

如果您的用户定义类遵循JavaBeans spec,那么您可以只使用encoder.writeObject()来序列化List<Foo>实例。这是因为XML输出只是关于如何在运行时重新创建给定实例的一系列指令。默认PersistenceDelegate知道如何序列化列表结构,但只有未知类的默认行为。默认情况下,它试图通过调用其空(无参数)构造函数来重新创建给定的对象实例,然后将其属性逐个设置为给定实例的值-如果该类是JavaBean,则保证可以做到这一点。

如果你的类有一些属性是只读的,即它们是由构造函数设置的,并且在构造时间之后不能改变,那么你必须(稍微)做更多的事情才能让它工作。您可以创建一个DefaultPersistenceDelegate的自定义实例,它可以识别您的类,并知道如何将适当的数据传递给它的构造函数-您只需将属性的名称作为列表传递给它,它就会完成其余的工作:

代码语言:javascript
复制
PersistenceDelegate fooDelegate = new DefaultPersistenceDelegate(new String[] {"propertyName1", "propertyName2"});
encoder.setPersistenceDelegate(Foo.class, fooDelegate);

如果您的类的构造函数参数不能通过getter方法直接映射到属性,并且/或者在恢复对象状态时存在其他复杂性,您通常可以通过扩展PersistenceDelegate并自己实现必要的行为来解决这些问题。但是,如果您的类在运行时重新创建非常复杂,并且您希望将其序列化,您应该认真考虑重新设计它以降低其复杂性-这将使整个过程变得更容易,并将极大地减少出错的机会,以及使其更容易在未来更改和扩展。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4602210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档