IMO、シリアライゼーションはEnumeration
あまり意味がありません。AnEnumeration
は、データ構造またはその他のビジネス ロジックの上にある単なるフローティング ビューです。シリアル化するには、バッキング インターフェイスのシリアル化に固執することをお勧めします。書いている内容を視覚化するために、小さなコード スニペットを設定しました。
import java.io.*;
import java.util.*;
import javax.swing.tree.TreePath;
public class EnumTest {
public class MyEnumerator<T> {
// set holding data
List<T> data;
public MyEnumerator(List<T> data) {
this.data = data;
}
public List<T> getData() {
return data;
}
public Enumeration<T> enumerate() {
return new Enumeration<T>() {
transient int i = 0;
@Override
public boolean hasMoreElements() {
return i < data.size();
}
@Override
public T nextElement() {
return data.get(i++);
}
};
}
}
public EnumTest() throws Exception {
List<TreePath> TreePaths = Arrays.asList(new TreePath[] { new TreePath("3"), new TreePath("4"), new TreePath("5") });
MyEnumerator<TreePath> myEnum1 = new MyEnumerator<TreePath>(TreePaths);
print(myEnum1);
FileOutputStream fos = new FileOutputStream("test.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(myEnum1.getData());
oos.close();
fos.close();
System.out.println("* Serialization complete");
FileInputStream fis = new FileInputStream("test.out");
ObjectInputStream ois = new ObjectInputStream(fis);
@SuppressWarnings("unchecked")
List<TreePath> data = (List<TreePath>) ois.readObject();
MyEnumerator<TreePath> myEnum2 = new MyEnumerator<TreePath>(data);
print(myEnum2);
System.out.println("* Deserialization complete");
}
private void print(MyEnumerator<TreePath> myEnum1) {
Enumeration<TreePath> enm = myEnum1.enumerate();
while (enm.hasMoreElements()) {
System.out.println(enm.nextElement());
}
}
public static void main(String[] args) throws Exception {
new EnumTest();
}
}
これは、含まれているデータを永続化し、後でEnumeration
ラッパー クラスを再構築することによって、それ自体をシリアル化するというトピックを回避します。MyEnumerator
シリアライゼーション/デシリアライゼーション ループを通じて、異なるオブジェクトを取得しますが、意味的には同一です。