2

まず、StreamCorruptedExceptionsに関していくつか質問があることは知っていますが、「無効なタイプコード:01」についてはほとんど質問がありません。

ローカルサーバーに接続されたローカルクライアントがあります。クライアントは、シリアル化可能な「Task_Data」オブジェクトをサーバーに送信しようとします。私が送信するために使用するコードは(クラッターを削除して):


    oos = new ObjectOutputStream(clientSocket.getOutputStream());

    Task_Data task = new Task_Data();
    task.setCheckMale(true);
    task.setCheckAdult(true);
    task.setAdditionalInfo("testing");
    task.setTakeNotes(true);
    task.setTakePhoto(true);
    oos.writeObject(task);
    oos.flush();

今、受信側(サーバー)に私は持っています:


    Task_Data task = (Task_Data) ois.readObject();
    System.out.println(task.getAdditionalInfo());

Eclipseはこのエラーをスローします:java.io.StreamCorruptedException:無効なタイプコード:01

奇妙なのは、UTFのような「プリミティブ」タイプの送信が問題なく機能することです。

おそらく原因は私のシリアル化にあり、Task_Dataクラスは次のとおりです。


public class Task_Data implements Serializable {

private static final long serialVersionUID = -226273890693695870L;

private boolean checkMale = true;
private boolean checkAdult = true;
private boolean takePhoto = true;
private boolean takeNotes = true;

private String additionalInfo = null;

private void writeObject(java.io.ObjectOutputStream out) throws IOException {
    out.writeBoolean(checkMale);
    out.writeBoolean(checkAdult);
    out.writeBoolean(takePhoto);
    out.writeBoolean(takeNotes);
    out.writeUTF(additionalInfo);
}


private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
    checkMale       =   in.readBoolean();
    checkAdult      =   in.readBoolean();
    takePhoto       =   in.readBoolean();
    takeNotes       =   in.readBoolean();
    additionalInfo  =   in.readUTF();
}
4

1 に答える 1

0

writeObject()メソッドは、そのようなメソッドの正規の署名に一致するため、シリアル化中に実行されますが、そうでないため、メソッドは実行されませreadObject()ん。したがって、非対称性が存在し、これを含むエラーが発生する可能性があります。

しかし、シリアライゼーションがデフォルトですでに行っていることを行う明示的なコードを書いた理由はわかりません。readObject()メソッドとメソッドをwriteObject()完全に削除し、既存のシリアル化されたストリームをすべて削除して、再テストします。

また、ソケットの存続期間中、必ず同じ ObjectInputStream と ObjectOutputStream を使用する必要があります。これらのストリームにはヘッダーがあり、一方の端で新しいヘッダーを開始すると、もう一方の端が混乱します。

于 2013-03-06T20:00:31.843 に答える