我正在使用roaring bitmaps存储值数组。
何时使用nodejs应用程序创建和序列化位图。 Java 应用程序获取序列化字符串并重新创建位图。
下面是 Node 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和node.js之间互操作?
最佳答案
您遇到字节顺序问题。来自 Javadoc:
Note: Java's data structures are in big endian format. Roaring serializes to a little endian format, so the bytes are flipped by the library during serialization to ensure that what is stored is in little endian---despite Java's big endianness. You can defeat this process by reflipping the bytes again in a custom DataOutput which could lead to serialized Roaring objects with an incorrect byte order.
关于java - RoaringBitmap使用node和java序列化为不同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57283642/