如何在Java中复制midi序列?

问题描述 投票:0回答:1

我使用以下代码复制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

这样做的正确方法是什么?

java javasound javax.sound.midi.sequence
1个回答
2
投票

如异常所示,Sequence不是可序列化的类,因此您无法对其进行序列化。

使用MidiSystem.writeMidiSystem.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。

如果你希望一种可以普遍复制任何对象的方法,我恐怕根本不可能。不可序列化的对象总是需要手动复制。

© www.soinside.com 2019 - 2024. All rights reserved.