繁体   English   中英

Java:如何将对象序列化为字节数组,且输出字节越少越好?

[英]Java: how to serialize object into byte array with as few output bytes as possible?

我在这里尝试了代码(从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中,有什么方法可以有效地序列化对象/对象数组并使输出字节数组尽可能短?

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

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

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

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


ObjectOututStream流很大的原因是,序列化/反序列化必须是类型安全的; 也就是说,它可以检测表示类型在序列化和反序列化之间已更改的情况。 这是通过在流中包含服务器UUID和类型描述符来完成的。 那需要空间。

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

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

有关详细信息,请参考Java Object Serialization规范

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM