【问题标题】:Java: how to serialize object into byte array with as few output bytes as possible?Java:如何将对象序列化为具有尽可能少的输出字节的字节数组?
【发布时间】:2016-05-14 22:59:15
【问题描述】:

我在这里尝试了代码 (Java Serializable Object to Byte Array) 和 SerializationUtils.serialize(),但是当我序列化一个对象时,我总是得到比对象中存储的字节数更多的字节。

例如,当我执行 SerializationUtils.serialize(new byte[1]) 时,我可以得到一个长度为 28 的输出字节数组,而输入对象有 1 个字节。同样,如果我有类似的课程

public class MyClass {
    public byte[] a;

    public MyClass(byte[] a) {
        this.a = a;
    }
}

我创建了一个对象

MyClass obj = new MyClass(new byte[1]);

当我做 SerializationUtils.serialize(obj) 时,我会得到一个比 1 长得多的输出字节数组。

我在我的程序中真正做的是我在两方之间发送对象数组,所以我想首先将这个对象数组序列化为一个单字节数组,然后发送它。但是 SerializationUtils.serialize(MyClass[] obj) 会输出一个比 obj 实际存储的字节多得多的数组,这增加了我的通信带宽。

我还尝试通过自己的内存复制从对象数组创建单字节数组:

MyClass[] obj = new MyClass[5];
for (int i=0; i<5; i++)
    obj[i] = new MyClass(new byte[1]);

byte[] msg = new byte[5];
for (int i=0; i<obj.length; i++)
    System.arraycopy(obj[i].a, 0, msg, i, 1);

但这似乎不如 SerializationUtils.serialize(MyClass[] obj) 有效,即使通过 SerializationUtils.serialize(MyClass[] obj) 会生成比我拥有的 msg 更多的字节。

那么在 Java 中是否有某种方法可以有效地序列化对象/对象数组并使输出字节数组尽可能短?

提前致谢。

【问题讨论】:

    标签: java serialization


    【解决方案1】:

    那么在 Java 中是否有某种方法可以有效地序列化对象/对象数组并使输出字节数组尽可能短?

    当然。您需要做的是编写自己的自定义序列化代码。例如,使用 DataOutputStream 您可以像这样序列化 byte[]

       dos.writeInt(bytes.length);
       dos.write(bytes, 0, bytes.length);
    

    如果数据是可压缩的,那么你可能会做得更好。

    对于用户定义的类型,序列化代码会更复杂。但是,如果您希望“输出字节数组尽可能短”......那么这就是你必须付出的代价!!


    ObjectOututStream 流很大的原因是要求序列化/反序列化是类型安全的;即它可以检测表示类型在序列化和反序列化之间发生变化的情况。这是通过在流中包含服务器 UUID 和类型描述符来完成的。这需要空间。

    请注意,您(程序员)可以通过其他方式改进序列化对象的大小:

    • 通过将不必要的字段声明为transient
    • 通过编写自定义readObject/writeObject。或
    • 通过将类声明为Externalizable,并实现节省空间的外部化方法。

    详情请参考Java Object Serialization spec

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 2011-02-19
      • 2016-04-18
      • 2014-03-24
      • 2021-05-25
      • 2015-06-03
      • 2014-09-02
      相关资源
      最近更新 更多