![](/img/trans.png)
[英]Java: how to serialize object into byte array with as few output bytes as possible?
[英]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.