【问题标题】:How to Serialize object to byte array with compact bytes in java如何在java中使用紧凑字节将对象序列化为字节数组
【发布时间】:2016-04-18 05:04:41
【问题描述】:

例如,我有一个类,它有 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

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

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

【问题讨论】:

  • 序列化后收到什么值?
  • long、int、short、byte、float、double ... 正常值。
  • 不,问题是您收到输出的确切字节数?
  • 现在怎么序列化呢?那会产生什么而不是预期的输出?
  • 我的服务器接收字节数据。但我没有样品。我只想知道如何使对象紧凑的字节数组

标签: java serialization


【解决方案1】:

如果你想要一个字节数组,你可以这样做。但是,如果您使用 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);

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 2014-12-07
      • 2021-05-25
      • 1970-01-01
      • 2011-02-19
      • 2014-09-02
      • 1970-01-01
      相关资源
      最近更新 更多