Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的类的序列化大小大于它的变量之和_Java_Serialization_Byte - Fatal编程技术网

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

我有一个简单的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 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>