Java将对象转换为字节数组的有效方法

时间:2014-06-25 10:30:42

标签: java io

我想将我的pojo对象转换为字节数组。我的所有对象都是可序列化的。我用

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        ObjectOutputStream o = new ObjectOutputStream(byteArrayOutputStream);
        o.writeObject(myobject);

        byte [] byteArray=byteArrayOutputStream.toByteArray();
        o.flush();
        o.close();
        byteArrayOutputStream.flush();
        byteArrayOutputStream.close();  

当对象转换为具有多个线程的字节数组时,此转换需要更多时间,并且每次转换的时间消耗(相同的对象进入字节数组)会逐渐增加。 (例如,第一个线程转换需要200ms,第二个线程获得300ms用于相同的对象转换)。可以任何人让我知道为什么这个对象转换时间逐渐增加和更好的转换方式。 (我找到了一种使用外化的方法。但是我的所有对象都必须用Externalizable重写。)

1 个答案:

答案 0 :(得分:1)

  

任何人都可以让我知道为什么这个对象转换时间会逐渐增加并且转换的方式更好。

ObjectOutputStream会产生大量垃圾,这会给你的L3缓存,主内存总线和GC带来压力。这些是共享资源,即一个线程的工作会影响所有其他资源。

注意:无论您在套接字上有1个核心还是12个核心,这都是一个问题。

  

我找到了使用外化的方法。

这可能是最简单的解决方案,如果你想避免使用另一个序列化的图书馆,如Kryo,thrift,protobuf等。我有一个我认为是最快的,但它绝对不是最简单的。例如它直接从/转换到本机内存并完全跳过byte [];)

  

但是我的所有对象都必须用Externalizable重写。

您可以从一个类开始,即添加最高负载的类,不需要全部执行。