繁体   English   中英

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

[英]How to Serialize object to byte array with compact bytes in java

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

class A{
    short a;
    byte b;
    int c;
}

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

如果值像

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

然后,我希望它的字节为

00 03 02 00 00 00 0F

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

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

如果需要字节数组,可以执行此操作。 但是,如果使用的是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);

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

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

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));
}

暂无
暂无

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

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