Serialization 如何用XML序列化同步的ArrayList?
当我尝试使用Serialization 如何用XML序列化同步的ArrayList?,serialization,synchronization,xml-serialization,java,Serialization,Synchronization,Xml Serialization,Java,当我尝试使用beans.xmlcoder和beans.xmldecorder对包装在Collections.synchronizedList中的ArrayList进行序列化和反序列化时,我得到以下错误: java.lang.reflect.InvocationTargetException Continuing ... java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject*Collecti
beans.xmlcoder
和beans.xmldecorder
对包装在Collections.synchronizedList
中的ArrayList
进行序列化和反序列化时,我得到以下错误:
java.lang.reflect.InvocationTargetException
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject*Collections$SynchronizedRandomAccessList);
Continuing ...
由于我正在使用的程序是一个多线程音乐库客户机/服务器应用程序,因此我需要同步。如果使用普通的ArrayList,序列化/反序列化工作正常。我真的不想使用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();
}
}
/**
*将库序列化为XML文件
*@param xmlFileLocation-XML文件的位置
*/
公共void存储库(字符串xmlFileLocation){
文件输出流;
试试{
fos=新的FileOutputStream(xmlFileLocation);
XMLEncoder编码器=新的XMLEncoder(fos);
编码器写入对象(lib);
encoder.close();
fos.close();
}捕获(例外e){
e、 printStackTrace();
}
}
/**
*库的构造函数,反序列化XML文件
*@param xmlFileLocation-XML文件的位置
*/
@抑制警告(“未选中”)
公共库(字符串xmlFileLocation){
文件输入流fis;
试试{
fis=新的FileInputStream(xmlFileLocation);
XMLDecoder decoder=新的XMLDecoder(fis);
对象o=解码器。readObject();
if(o instanceof List)
setLib((列表)o);
close();
fis.close();
}捕获(例外e){
e、 printStackTrace();
}
}
正如我所说的,我真的不想使用Vector,因为它包含很多遗留操作。但是序列化时需要同步吗?我可能会在复制到新的
ArrayList
时锁定对列表的访问,然后序列化副本。那么,如何将同步列表复制到非同步列表?synchronized(synchronizedList){返回新的ArrayList(synchronizedList);}
@JBNizet。显然,音乐描述
也必须是不可变的。但不管有没有连载,这都是事实。