gpt4 book ai didi

java - 避免 Java Sound 类中的级联序列化?

转载 作者:行者123 更新时间:2023-11-30 06:55:29 25 4
gpt4 key购买 nike

目前,我正在尝试通过 Socket 发送一个“Message”类对象,其中包含一个 AudioFormat 和一个 Mixer,第二个 Java 应用程序将使用它来配置自身。

public class Message implements Serializable {

private static final long serialVersionUID = 1L;

SerializableAudioFormat audioFormat;
Mixer mixer;

public Message(SerializableAudioFormat audioFormat, Mixer mixer) {
this.audioFormat = audioFormat;
this.mixer = mixer;
}

public SerializableAudioFormat getAudioFormat() {
return this.audioFormat;
}

public Mixer getMixer() {
return this.mixer;
}

}

我必须序列化 AudioFormat,因为默认情况下它不是序列化的,因此我创建了您可以在构造函数中看到的类“SerializedAudioFormat”。该类的代码如下。

SerializedAudioFormat 类:

public class SerializableAudioFormat implements Serializable {

private static final long serialVersionUID = 1L;

transient AudioFormat format;

public SerializableAudioFormat(AudioFormat format) {
this.format = format;
}

public AudioFormat getAf() {
return this.format;
}

private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(new SerializableEncoding(format.getEncoding()));
out.writeFloat(format.getSampleRate());
out.writeInt(format.getSampleSizeInBits());
out.writeInt(format.getChannels());
out.writeInt(format.getFrameSize());
out.writeFloat(format.getFrameRate());
out.writeBoolean(format.isBigEndian());
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
format = new AudioFormat(((SerializableEncoding) in.readObject()).getEncoding(), in.readFloat(), in.readInt(),
in.readInt(), in.readInt(), in.readFloat(), in.readBoolean());
}

}

正如您所看到的,由于同样的原因,编码也必须被序列化。该类如下。

SerializedEncoding 类:

public class SerializableEncoding implements Serializable {

private static final long serialVersionUID = 1L;

transient Encoding encoding;

public SerializableEncoding(Encoding encoding) {
this.encoding = encoding;
}

public Encoding getEncoding() {
return this.encoding;
}

private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(this);
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
encoding = ((SerializableEncoding) in.readObject()).getEncoding();
}

}

问题是我从一个错误开始,说......

线程“main”中出现异常 java.io.WriteAbortedException:写入中止; java.io.NotSerializedException:...

首先使用 AudioFormat 直到我包装它,然后使用 AudioFormat.Encoding 直到我也包装它。

现在,我的问题出在接口(interface) Mixer 上,因为我收到的错误消息如下。

线程“main”中出现异常 java.io.WriteAbortedException:写入中止; java.io.NotSerializedException:com.sun.media.sound.DirectAudioDevice

所以我的问题是,对于这种您尚未开发类且大多数类未实现可序列化的情况,是否有其他解决方法?是否可以避免这种“大规模序列化​​”?

最佳答案

回答标题中的问题:

out.writeObject(this);

递归就在这里。你已经在调用者中这样做了。删除。

关于java - 避免 Java Sound 类中的级联序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com