gpt4 book ai didi

java - 在 writeObject(null) 之后期望是 0 个字节,但我发现是 5 个字节,这是怎么回事?

转载 作者:行者123 更新时间:2023-11-29 09:41:20 24 4
gpt4 key购买 nike

将对象写入 ByteArrayOutputStream 时,我得到了一些奇怪的结果。

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(baos);
os.writeObject(null);

byte[] objectBytes = baos.toByteArray();
int objectSize = objectBytes.length;

所以我向 ByteArrayOutputStream 写入一个 null,然后当我从这个流中检索字节而不是找到 0 个字节时,我发现有 5 个。字节的值如下 -

  • [0] => -84
  • [1] => -19
  • [2] => 0
  • [3] => 5
  • [4] => 112

如果我将 os.writeObject(null) 更改为 os.writeObject("A") 我得到 8 个字节,这些是 -

  • [0] => -84
  • [1] => -19
  • [2] => 0
  • [3] => 5
  • [4] => 116
  • [5] => 0
  • [6] => 65
  • [7] => 8

那么这里发生了什么,如果我写入 0 个字节,我希望在检索字节数组时找到字节。然后我看到它增加了额外的 5 个字节。因此,当我写“A”时,我希望它返回字节数组中的 6 个字节,但它返回 8 个字节。这是怎么回事?

最佳答案

首先,当您编写 null 时,您并没有什么都不写。您正在写入一个空值。序列化过程必须确保当你反序列化时,你会得到一个 null ,所以它必须以某种方式表示。开头也可能有开销来标记流的开始。

同样,当您写“A”时,您不仅仅是在输入“A”字符。您正在序列化一个完整的 String 对象。这必须包含反序列化器稍后重建具有相同值的 String 对象的信息。所以有类型信息和内容。内容本身也将占用多个字节,因为 Java 在内部将 String 表示为一个 char 数组,它们是 2 个字节的值,还因为字符串的长度必须以某种方式编码(实际上我什至很惊讶他们会把所有这些都放在 8 个字节中)。

编辑: 我已经查看了 this page 上的解释.我们可以使用它来了解您获得的结果。

在第一个示例中,您有以下字节:

  • AC ED(-84 -19 的十六进制):STREAM_MAGIC。一个神奇的值,指定这是一个序列化协议(protocol)。
  • 00 05:STREAM_VERSION。版本 5.
  • 70(112的十六进制):TC_NULL,表示空值。

在您的第二个示例中,实际上您提供的值并不对应。我自己试过你的代码,我得到了:

  • AC ED:STREAM_MAGIC
  • 00 05:STREAM_VERSION
  • 74 : TC_STRING, 代表一个新的String
  • 00 01:字符串的长度(1)
  • 65:“A”的 UTF8 表示。

对于最后一个字节,我显然有点不对:即使 Java 在内部使用 2 字节的字符表示形式,它也会使用 UTF8 对字符串进行编码,UTF8 仅使用一个字节来表示字符“A”。

格式中的所有特殊值都是ObjectStreamConstants类中的常量

关于java - 在 writeObject(null) 之后期望是 0 个字节,但我发现是 5 个字节,这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15045198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com