【问题标题】:Java serialize and immediately deserialize gives error [duplicate]Java序列化并立即反序列化给出错误[重复]
【发布时间】:2017-08-30 22:41:13
【问题描述】:
    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();
    }

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

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

  1. 围绕 ByteArrayOutputStream 创建一个 ObjectOutputStream
  2. 将一个(简单!)对象写入 OOS
  3. 从 BAOS 获取 UTF-8 字符串
  4. 围绕该字符串的 UTF-8 字节创建一个围绕 ByteArrayInputStream 的 ObjectInputStream
  5. 从 OIS 读取对象

但是在第 4 步,在 ObjectInputStream 的构造函数期间,程序崩溃并出现 StreamCorruptedException。我对此感到非常困惑,因为字节实际上是 just 由 ObjectOutputStream 产生的!

【问题讨论】:

  • 你认为os.toString("UTF-8") 是做什么的?你为什么这么认为?你认为serialized.getBytes("UTF-8") 做了什么?为什么?
  • 字符串(逻辑上)是char[],而不是byte[];转换为char[] 会损坏数据。如果您想以字符串形式传输数据,请执行 base64 编码字节之类的操作。
  • String 不是二进制数据的容器。

标签: java serialization objectinputstream objectoutputstream


【解决方案1】:

不要将byte[]String 相互转换,这将解释特殊(宽)字符。相反,只需直接使用来自ByteArrayOutputStream 的字节。喜欢,

ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多