首页 > 解决方案 > RoaringBitmap 使用 node 和 java 序列化为不同的字符串

问题描述

我正在使用咆哮的位图来存储值数组。

何时使用 nodejs 应用程序创建和序列化位图。Java 应用程序获取序列化字符串并重新创建位图。

下面是节点js代码-

 const RoaringBitmap32 = require('roaring/RoaringBitmap32');
const bitmap2 = new RoaringBitmap32([3, 4, 100]);
console.log('bitmap2.toArray():', bitmap2.toArray());
console.log('contentToString:', bitmap2.contentToString());
const serialized = bitmap2.serialize()
console.log("serialized " + serialized)
console.log('base 64 serialized:', serialized.toString('base64'))
console.log('deserialized:', RoaringBitmap32.deserialize(serialized).toArray())

下面是输出 -

bitmap2.toArray(): [ 3, 4, 100 ]
contentToString: [3,4,100]
serialized d
base 64 serialized: AQMAAAADAAAABAAAAGQAAAA=
deserialized: [ 3, 4, 100 ]

下面是java代码 -

public static void main(String[] args) {
    MutableRoaringBitmap mrb = MutableRoaringBitmap.bitmapOf(3, 4, 100);
    System.out.println("starting with  bitmap "+ mrb);
    ByteBuffer outbb = ByteBuffer.allocate(mrb.serializedSizeInBytes());
    mrb.serialize(outbb);
    outbb.flip();
    String serializedstring = Base64.getEncoder().encodeToString(outbb.array());
    System.out.println("serializedstring :\n" + serializedstring);
}

java代码的输出是-

starting with  bitmap {3,4,100}
serializedstring :
OjAAAAEAAAAAAAIAEAAAAAMABABkAA==

我的问题是为什么具有相同内容的位图会产生不同的序列化字符串?

java - 如何使咆哮位图的序列化和反序列化在java和node.js之间可互操作?

标签: javanode.jsbitmap

解决方案


你有一个字节顺序问题。来自 Javadoc:

注意:Java 的数据结构是大端格式。Roaring 序列化为小端格式,因此在序列化过程中字节被库翻转以确保存储的内容是小端——尽管 Java 有大端。您可以通过在自定义 DataOutput 中再次重新翻转字节来破坏此过程,这可能会导致序列化的 Roaring 对象的字节顺序不正确。


推荐阅读