StreamCorruptedException:无效的类型代码:在Client Server连接中为01

时间:2013-03-06 14:08:07

标签: java serialization deserialization objectinputstream

首先,我知道有一些关于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();
}

1 个答案:

答案 0 :(得分:0)

您的writeObject()方法将在序列化期间执行,因为它与此类方法的规范签名一致,但您的readObject()方法不会,因为它不会。因此存在不对称性,这可能导致任何错误,包括此错误。

但是我不知道为什么你编写了显式代码来执行Serialization默认情况下已经执行的操作。我将完全摆脱readObject()writeObject()方法,以及任何现有的序列化流,并重新测试。

您还必须确保在套接字的生命周期中使用相同的ObjectInputStream和ObjectOutputStream。这些流上有标题,一端开始新标题会混淆另一端。