Java序列化并立即反序列化会产生错误

Java序列化并立即反序列化会产生错误,java,serialization,objectinputstream,objectoutputstream,Java,Serialization,Objectinputstream,Objectoutputstream,所以我有一段代码,我正在使用它将一个对象序列化为java.lang.String,然后反序列化它。我使用对象流来进行对象写入/读取,使用字节数组流来进行字符串处理。但是,当我试图围绕序列化对象构造ObjectInputStream时,我得到一个StreamCorruptedException,声称存在一个“无效流头” 上面的代码示例是我能找到的最基本的代码片段,它再现了我的问题(而且非常简单!)。据我所知,我做每件事都是完全对称的: 围绕ByteArrayOutputStream生成Object

所以我有一段代码,我正在使用它将一个对象序列化为java.lang.String,然后反序列化它。我使用对象流来进行对象写入/读取,使用字节数组流来进行字符串处理。但是,当我试图围绕序列化对象构造ObjectInputStream时,我得到一个StreamCorruptedException,声称存在一个“无效流头”

上面的代码示例是我能找到的最基本的代码片段,它再现了我的问题(而且非常简单!)。据我所知,我做每件事都是完全对称的:

  • 围绕ByteArrayOutputStream生成ObjectOutputStream
  • 向OOS写入一个(简单!)对象
  • 从BAOS获取UTF-8字符串
  • 围绕该字符串的UTF-8字节的ByteArrayInputStream生成ObjectInputStream
  • 从OIS读取对象

  • 但在第4步,在ObjectInputStream的构造函数中,程序会因StreamCorruptedException而崩溃。考虑到字节实际上是由ObjectOutputStream生成的,我对此感到非常困惑

    不要将
    字节[]
    转换为
    字符串,也不要将其转换为
    字符串,该字符串将解释特殊(宽)字符。相反,只需直接使用
    ByteArrayOutputStream
    中的字节即可。像

        Object before = "";
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(os);
        oo.writeObject(before);
        oo.close();
    
        String serialized = os.toString("UTF-8");
    
        ByteArrayInputStream is = new ByteArrayInputStream(serialized.getBytes("UTF-8"));
        try(ObjectInputStream io = new ObjectInputStream(is)) {
            Object after = io.readObject();
            System.err.println("Object deserialization successful.");
        } catch (Exception e) {
            System.err.println("Object deserialization error.");
            System.err.println("Type being serialized: " + before.getClass());
            System.err.println("Serialization as bytes: " + Arrays.toString(serialized.getBytes("UTF-8")));
            e.printStackTrace();
        }
    

    你认为os.toString(“UTF-8”)
    有什么作用?你为什么这么认为?您认为
    序列化的.getBytes(“UTF-8”)
    有什么作用?为什么?字符串(逻辑上)是
    char[]
    ,而不是
    byte[]
    ;转换为
    char[]
    将损坏数据。如果要以字符串形式传输数据,请执行base64编码之类的操作。
    string
    不是二进制数据的容器。
    ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());