我使用以下代码复制javax.sound.midi.Sequence
:
private Object copyObject(Object objSource)
{
Object objDest=null;
try
{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(objSource);
oos.flush();
oos.close();
bos.close();
byte[] byteData=bos.toByteArray();
ByteArrayInputStream bais=new ByteArrayInputStream(byteData);
try { objDest=new ObjectInputStream(bais).readObject(); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
catch (IOException e) { e.printStackTrace(); }
return objDest;
}
javax.sound.midi.Sequence sequence;
...
javax.sound.midi.Sequence newSequence=(Sequence)copyObject(sequence);
我收到以下错误:
java.io.NotSerializableException:javax.sound.midi.Sequence
这样做的正确方法是什么?
如异常所示,Sequence不是可序列化的类,因此您无法对其进行序列化。
使用MidiSystem.write和MidiSystem.getSequence代替ObjectOutputStream和ObjectInputStream:
if (objSource instanceof Sequence) {
Sequence sequence = (Sequence) objSource;
int[] types = MidiSystem.getMidiFileTypes(sequence);
MidiSystem.write(sequence, types[0], bos);
byte[] byteData = bos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(byteData);
try {
return MidiSystem.getSequence(bais);
} catch (InvalidMidiDataException e) {
throw new IOException(e);
}
}
另一种方法是创建一个新的序列,并复制每个原始序列的轨道,这意味着使用克隆的MidiMessages复制每个Track的MidiEvents。
如果你希望一种可以普遍复制任何对象的方法,我恐怕根本不可能。不可序列化的对象总是需要手动复制。