避免Java声音类中的序列化级联?
目前,我正试图通过一个套接字发送一个对象,它是一个“消息”类,它包含一个音频格式和一个混音器,第二个Java应用程序将使用它来配置自己避免Java声音类中的序列化级联?,java,sockets,serialization,Java,Sockets,Serialization,目前,我正试图通过一个套接字发送一个对象,它是一个“消息”类,它包含一个音频格式和一个混音器,第二个Java应用程序将使用它来配置自己 public class Message implements Serializable { private static final long serialVersionUID = 1L; SerializableAudioFormat audioFormat; Mixer mixer; public Message(SerializableAudioF
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,因为默认情况下它不是,所以我创建了可以在构造函数中看到的类“SerializableAudioFormat”。该类的代码如下所示
SerializableAudioFormat类:
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());
}
}
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();
}
}
正如您所看到的,编码也必须被序列化,因为同样的原因。这门课是下面的
SerializableEncoding类:
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());
}
}
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.WriteableOrtedException中出现异常:写入中止;java.io.NotSerializableException:
首先使用AudioFormat直到我包装它,然后使用AudioFormat.Encoding直到我也包装它
现在,我的问题是接口混合器,因为我得到的错误消息如下
线程“main”java.io.WriteAbortedException中出现异常:写入中止;java.io.NotSerializableException:com.sun.media.sound.DirectAudioDevice
所以我的问题是,对于这种场景,如果您还没有开发类,并且大多数类都没有实现可序列化,那么还有其他解决方法吗?可以避免这种“大规模序列化”吗?回答标题中的问题:
out.writeObject(this);
递归就在这里。你已经在打电话了。删除。感谢您的回复,解决了问题!但是,当一个NullPointerException弹出时,我似乎无法向其他Java应用程序获取该字段的值。是否还有其他与序列化相关的问题?