Java 为什么我的类的序列化大小大于它的变量之和
我有一个简单的Java类:Java 为什么我的类的序列化大小大于它的变量之和,java,serialization,byte,Java,Serialization,Byte,我有一个简单的Java类: import java.io.Serializable; public class SimpleClass implements Serializable { private static final long serialVersionUID = -9062339996046009959L; public byte Byte; public int id; public SimpleClass(byte Byte, int
import java.io.Serializable;
public class SimpleClass implements Serializable {
private static final long serialVersionUID = -9062339996046009959L;
public byte Byte;
public int id;
public SimpleClass(byte Byte, int id) {
this.Byte = Byte;
this.id = id;
}
}
既然int是4个字节,一个字节就是一个字节,这个类不需要5个字节吗
但是当我序列化它并找到字节数组的长度时,我得到59
为什么会发生这种情况
我还使用它将对象转换为字节数组。简单:Java序列化的远不止字段值。参见相应的规范 例如,您注意到serialVersionUID吗?这也必须进入二进制数据。当然,还有完整的类名(绝对-包括包) 请记住:其思想是可以将任意(可序列化)对象序列化为字节流。反序列化时,不会指定这样一个字节流中所有对象的类型
换句话说:这些字节必须包含恢复包含的对象实例所需的所有信息。因此,您需要完整的类名;如果存在,则该ServialVersionID用于一致性检查。因为序列化支持模式演化。也就是说,即使对象类的定义已经更改,也可以反序列化对象。这是允许长期存储序列化对象所必需的 为了实现这一点,序列化流对有关序列化对象结构的元数据进行编码。每个流只写入一次此信息,即,如果流包含同一类的多个对象,则只写入一次类元数据 对于支持多态性的序列化(您可以发送接收方期望的任何子类型的对象),此元数据还包括类的完全限定名 为了提醒您对数据结构的不兼容更改,元数据还包含类定义(serialVersionUID)的校验和 请注意,模式演化是任何序列化协议的一个相当标准的特性。例如,JSON和XML为要封送的每个对象写入字段名:
{Byte:0,id:42}
(14字节)
042
(62字节)因为为类序列化的数据不仅仅包含字段值。具体而言:
至少。哪个字节数组?因为序列化编码的不仅仅是类中存在的数据。这是这里的一个关键点:这是一个类,不是一个C结构。有关更多信息,您可以查看。此处还有其他可用信息:
<SimpleClass><Byte>0</Byte><id>42</id></SimpleClass>