java - 流损坏异常 : invalid type code: 01 in Client Server connection

标签 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();
}

最佳答案

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

但我不知道为什么您要编写明确的代码来执行序列化默认情况下已经执行的操作。我会完全摆脱 readObject()writeObject() 方法,以及任何现有的序列化流,然后重新测试。

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

关于java - 流损坏异常 : invalid type code: 01 in Client Server connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15249470/

相关文章:

c# - 如何序列化一个类实现两个具有相同基础接口(interface)的接口(interface)

java - 解析具有后代元素的 JSON 列表

java - 将不同格式的JSON字符串反序列化为同一个Java类的实例

java - 切换到横向布局时应用程序崩溃

c# - 序列化派生类不包括基类的字段

java - EnumSet 序列化

java - Unicode 字符 ""有什么特别之处,以至于它破坏了基于大括号的解析器逻辑?

java - 无法访问 HTTP 调用程序远程服务

java - 是否可以在运行时可靠地检测哪个商店安装了 Android 应用程序(Google Play 或亚马逊市场)?

java - 如何以编程方式启动 JHiccup?