使用序列化读取和写入java对象

时间:2012-12-06 16:40:26

标签: java serialization

现在写我有这个类,我希望能够使用序列化保存和打开:

public class Region implements Serializable
{
private final int      inputNumberOfColumnsAlongXAxis;
private final int      inputNumberOfColumnsAlongYAxis;
private double         inputDataScaleReductionOnXAxis;
private double         inputDataScaleReductionOnYAxis;

private int            numberOfColumnsAlongXAxis;
private int            numberOfColumnsAlongYAxis;
private int            cellsPerColumn;                // Z-Axis dimension
private float          inhibitionRadius;
private final float    percentMinimumOverlapScore;
private final float    minimumOverlapScore;

我以前从未做过对象序列化,所以任何帮助都会非常感激!

4 个答案:

答案 0 :(得分:2)

您需要做的最简单的事情是为您的类添加名为serialVersionUID的私有静态字段。例如:

private static final long serialVersionUID = 1L;

默认序列化机制使用它来匹配类名和格式。

然后,您可以将对象的实例写入ObjectOutputStream并从ObjectInputStream读回来:

Region r = . . .;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(r);
oos.close();
ObjectInputStream ois = new ObjectInputStream(
    new ByteArrayInputStream(bos.getBytes()));
Region r2 = (Region) ois.readObject();
// voilà - a very expensive clone()!

要更好地控制对象序列化,可以实现以下方法:

private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
 private void readObjectNoData() 
     throws ObjectStreamException;

然后,您可以完全控制对象的序列化。有关详细信息,请参阅Serializable上的文档。

更新:严格来说,您不需要声明serialVersionUID;如果缺少运行时环境,它将自动为您计算一个。但是,文档对此有所说明(强调原文):

  

但是,强烈建议所有可序列化类都显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,可能因编译器实现而异,因此可能导致意外反序列化期间InvalidClassException

答案 1 :(得分:0)

你不需要在那里做任何事情,因为所有Region属性都是原始类型,即可序列化。将您的类标记为Serializable已经可以解决问题了。

更新:抱歉,我错过了,您需要添加serialVersionUID

答案 2 :(得分:0)

关于如何在互联网上使用Java进行对象序列化,有大量文档和大量示例。通过实施Serializable界面,您走在正确的轨道上。

要实际序列化课程,请查看ObjectOutputStream

答案 3 :(得分:0)

结帐此链接以获取示例代码:http://www.tutorialspoint.com/java/java_serialization.htm

考虑使用jaxb库(java 6及更高版本的一部分),您可以序列化为xml,为您提供依赖格式的人类可读java。