如何在java中使用紧凑字节将对象序列化为字节数组

时间:2016-01-13 09:37:29

标签: java serialization

例如,我有一个具有short,byte,int类型成员变量的类。

A a = new A();
a.a = 3;
a.b = 0x02;
a.c = 15;

如果我序列化或转换为字节数组,则Array是意外值。

如果值如,

00 03 02 00 00 00 0F

然后,我希望它的字节为,

{{1}}

那么......如何像这样序列化对象?

它需要我的套接字服务器......其他语言

2 个答案:

答案 0 :(得分:3)

如果你想要一个字节数组,你可以这样做。但是,如果您使用DataOutputStream之类的东西,最好只调用writeInt,writeShort,...

A a = new A();
a.a = 3;
a.b = 0x02;
a.c = 15;

ByteBuffer bb = ByteBuffer.allocate(7).order(ByteOrder.BIG_ENDIAN);
bb.putShort(a.a).put(a.b).putInt(a.c).flip();
byte[] buffer = bb.array();
for (byte b : buffer)
    System.out.printf("%02X ", b);

答案 1 :(得分:0)

您可以使用反射来获取类中的所有fields,并将它们循环以转换为字节数组。

如果您的所有字段都是Number(即不是引用也不是boolean),您可以将其转换并收集到List Byte,如下所示:

List<Byte> list = new ArrayList<>();
for (Field field : A.class.getDeclaredFields()) {
    // Do something else if field is not a Number
    // ...

    // Otherwise, convert and collect into list
    Number n = (Number) field.get(a);
    int size = n.getClass().getDeclaredField("BYTES").getInt(null);
    IntStream.range(0, size)
        .mapToObj(i -> (byte) (n.longValue() >> 8*(size-i-1)))
        .forEach(b -> list.add(b));
}