通过ObjectOutputStream得到二进制和String的getBytes()函数有什么区别?

新手上路,请多包涵

对于下面的代码:
图片描述
经试验,方法一比方法二多出7个字节,这是因为什么呢?
本人自己查找相关资料如下:
(1)https://stackoverflow.com/que...
(2)https://docs.oracle.com/javas...
(3)https://en.wikipedia.org/wiki...
但是并没有真正看懂原理,因为我觉得如果是因为字符编码的原因,那tes的二进制应该和ASCII保持一致的吧,看上面资料,英文字母都在ascii表里面,而utf-8和modified utf-8都是和ascii兼容的,所以,字节数为什么不一样呢?

阅读 3k
4 个回答

ObjectOutputStream是用来处理序列化的,写入字符串的的时候肯定不只是写入字符串的内容,还有一些元数据。
看源代码

        //ObjectOutputStream
        bout.writeShort(STREAM_MAGIC);
        bout.writeShort(STREAM_VERSION);
        bout.writeByte(TC_STRING);
        writeShort((int) utflen); 

2+2+1+2刚好是7个字节,具体见源代码

其实就是字符编码的原因。有些字节的组合是无法对应字符的(哪怕UTF-8也是),Java会把它们对应成?,再编码成字节就会有缺失。

java的对象序列化是特殊处理的.
你可以尝试把一个list序列化后再还原.
但你无法直接得到list的字节数组.

objectoutputstream写的对象是要求被序列化的,那么序列化的对象会有一些元数据

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题