现在写我有这个类,我希望能够使用序列化保存和打开:
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;
我以前从未做过对象序列化,所以任何帮助都会非常感激!
答案 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。