andを使用してArrayList
ラップされたをシリアライズおよびデシリアライズしようとすると、次のエラーが発生します。Collections.synchronizedList
beans.XMLEncoder
beans.XMLDecoder
java.lang.reflect.InvocationTargetException
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject*Collections$SynchronizedRandomAccessList);
Continuing ...
私が取り組んでいるプログラムはマルチスレッドの音楽ライブラリ クライアント/サーバー アプリケーションであるため、同期が必要です。通常の ArrayList を使用している場合、シリアライゼーション/デシリアライゼーションは正常に機能します。Vector には多くのレガシー操作が含まれているため、Vector は使用したくありません。
シリアル化および逆シリアル化する私の方法は次のとおりです。
/**
* Serializes library into an XML file
* @param xmlFileLocation - location of XML file
*/
public void saveLibrary (String xmlFileLocation) {
FileOutputStream fos;
try {
fos = new FileOutputStream(xmlFileLocation);
XMLEncoder encoder = new XMLEncoder(fos);
encoder.writeObject(lib);
encoder.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Constructor for Library, deserializes XML file
* @param xmlFileLocation - location of XML file
*/
@SuppressWarnings("unchecked")
public Library(String xmlFileLocation) {
FileInputStream fis;
try {
fis = new FileInputStream(xmlFileLocation);
XMLDecoder decoder = new XMLDecoder(fis);
Object o = decoder.readObject();
if (o instanceof List)
setLib((List<MusicDescription>) o);
decoder.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
前述のとおり、Vector には多くのレガシー操作が含まれているため、Vector は使用したくありません。