Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免Java声音类中的序列化级联?_Java_Sockets_Serialization - Fatal编程技术网

避免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

目前,我正试图通过一个套接字发送一个对象,它是一个“消息”类,它包含一个音频格式和一个混音器,第二个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,因为默认情况下它不是,所以我创建了可以在构造函数中看到的类“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应用程序获取该字段的值。是否还有其他与序列化相关的问题?