【问题标题】:Serialize an object with a List member使用 List 成员序列化对象
【发布时间】:2011-01-27 22:40:27
【问题描述】:

给定以下类:

public class Container {
    private List<SomeData> list;
    // public getter & setter for list
}

public class SomeData {
    private String data;
   // public getter & setter for data
}

当我运行以下代码时:

import java.beans.XMLEncoder;
import java.io.FileOutputStream;

SomeData someData1 = new SomeData();
SomeData someData2 = new SomeData();

someData1.setData("data1");
someData2.setData("data2");

List<SomeData> data = new ArrayList<SomeData>();
data.add(someData1);
data.add(someData2);

Container container = new Container();
container.setList(data); 

FileOutputStream os = new FileOutputStream("c:\test.xml");
XMLEncoder encoder = new XMLEncoder(os);
encoder.writeObject(container);
encoder.close();

当我查看“test.xml”时,只有容器对象的数据,而列表中的 SomeData 对象没有任何数据(即字符串“data1”和“data2”):

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_22" class="java.beans.XMLDecoder"> 
 <object class="Container"> 
  <void property="container"> 
   <object class="java.util.ArrayList"> 
    <void method="add"> 
     <object class="SomeData"/> 
    </void> 
    <void method="add"> 
     <object class="SomeData"/> 
    </void> 
   </object> 
  </void> 
 </object> 
</java> 

如何序列化“容器”和存储在“容器”列表中的 SomeData 对象?

【问题讨论】:

  • 嗯,显然有一些东西,SomeData 的两个实例,但它们的字段丢失了。
  • 仅供参考:这在我的机器上运行良好。另外,我认为您的代码与示例输出不一致。在输出中,您在容器下有属性“容器”,但在示例代码中 - 属性的名称是“列表”。因此,请检查您的代码中的“SomeData”字段设置。
  • 是的 - 我手工创建了上面的例子,所以可能会有错误。如果它在您的机器上运行良好,您的意思是您在 xml 中获得了字符串“data1”和“data2”?代码和上面的完全一样吗,还是你调整了?
  • 奇怪的是,我上面写的代码确实有效,尽管与原始代码几乎相同。是时候打破差异工具了。

标签: java xml-serialization xmlencoder


【解决方案1】:

只要我为根据 java beans 命名约定命名的 SomeData.data 提供 getter,代码就可以正常工作:

SomeData.getData()

如果我更改 getter 的名称,序列化将无法工作。

【讨论】:

  • 我不确定我做了什么,因为我拥有的代码与我发布的代码相同(名称更改除外)。我基本上重写了代码并且成功了!显然我错过了一些东西。感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2019-01-17
  • 2015-01-22
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多