【问题标题】:How to convert an array of objects to byte[]如何将对象数组转换为 byte[]
【发布时间】:2021-10-20 00:59:18
【问题描述】:

我有一个对象数组。这些对象提供toByteArray() 方法。 如果我打电话给foo.toByteArray(),我会得到这个对象的字节表示。

我正在努力将这个对象数组转换为字节数组。

我的第一个方法是:

Arrays.stream(fooArray).map((fooEntry) -> fooEntry.toByteArray()).toArray();

但是,这确实返回了一个对象数组而不是 byte[]。 做我想做的最简单的方法是什么?

【问题讨论】:

  • 从概念上讲,您需要使用flatMap 而不是map。但是,它并不像数组那么简单。
  • 您对对象的toByteArray() 实现是什么?
  • 对象基本上代表一个字节值和一个短值。 toByteArray 执行以下操作:return new byte[] {validFlag, (byte) ((value>> Byte.SIZE) & BinaryDataUtil.BYTE_MASK), (byte) (value & BinaryDataUtil.BYTE_MASK) };

标签: java arrays stream byte primitive


【解决方案1】:

基于以下 SO 问题的公认答案...
ArrayList of byte[] to byte[] using stream in Java
并对方法toByteArray 进行简单实现,希望以下内容能够满足您的需求。 (代码后的注释。)

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Arrays;

public class Foo {
    public byte[] toByteArray() {
        return new byte[]{(byte) -1};
    }

    public static void main(String[] args) {
        Foo[] fooArray = new Foo[]{new Foo(), new Foo()};
        byte[] bytes = Arrays.stream(fooArray)
                             .map(foo -> foo.toByteArray())
                             .collect(() -> new ByteArrayOutputStream(),
                                      (b, e) -> b.write(e, 0, e.length),
                                      (a, b) -> {
                                          try {
                                              b.writeTo(a);
                                          }
                                          catch (IOException x) {
                                              throw new UncheckedIOException(x);
                                          }
                                      })
                             .toByteArray();
    }
}

map 返回一个流,其中流中的每个元素都是一个字节数组,即byte[]。然后,您只需将所有字节数组中的所有字节收集到ByteArrayOutputStream 中。然后调用ByteArrayOutputStream类的方法toByteArray

请注意,writeTo 方法抛出 IOException 并且检查的异常在 lambda 表达式中处理起来并不简单。因此它被包裹在UncheckedIOException 中,这是一个未经检查的异常。

【讨论】:

    【解决方案2】:

    数组是可序列化的,因此只要您的对象也是可序列化的,那么您应该能够将数组转换为 byte[],而无需访问元素的 toByteArray() 方法。

    首先确保您的对象是可序列化的:

    public class MyObject implements Serializable {
    //... Your class 
    }
    

    现在您应该能够使用ByteArrayOutputStream: 序列化整个数组

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(fooArray);
    oos.flush();
    byte[] byteArray = bos.toByteArray();
    

    我不确定这是否是最好的方法,因为我对 Java 很陌生,但这应该可行。

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2010-12-02
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多