0

シリアライゼーションを使用して保存して開くことができるようにしたいこのクラスがあります。

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

4 に答える 4

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デシリアライズ中に予期しない s が発生する可能性があるためです。

于 2012-12-06T16:43:55.557 に答える
0

サンプルコードについては、このリンクをチェックしてください: http://www.tutorialspoint.com/java/java_serialization.htm

jaxb ライブラリ (Java 6 以降の一部) を使用することを検討してください。xml にシリアライズして、人間が読める Java を依存形式で提供できます。

于 2012-12-06T16:48:27.967 に答える
0

Region 属性はすべてプリミティブ型、つまりシリアライズ可能であるため、そこでは何もする必要はありません。クラスをシリアライズ可能としてマークすると、すでにうまくいきます。

更新: 見逃して申し訳ありません。追加する必要がありますserialVersionUID

于 2012-12-06T16:45:16.267 に答える
0

Java でオブジェクトのシリアル化を行う方法については、インターネット上に大量のドキュメントと多数の例があります。インターフェイスを実装することで、正しい軌道に乗っていSerializableます。

クラスを実際にシリアライズするには、ObjectOutputStreamを見てください。

于 2012-12-06T16:46:55.520 に答える