java - 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之间可互操作?
解决方案
你有一个字节顺序问题。来自 Javadoc:
注意:Java 的数据结构是大端格式。Roaring 序列化为小端格式,因此在序列化过程中字节被库翻转以确保存储的内容是小端——尽管 Java 有大端。您可以通过在自定义 DataOutput 中再次重新翻转字节来破坏此过程,这可能会导致序列化的 Roaring 对象的字节顺序不正确。
推荐阅读
- android - 在 Mapbox Android SDK 中更改颜色 3D 构建运行时
- android - 处理颤动中动态可扩展列表的项目点击
- r - R:在 RandomForestSRC 中用时变协变量拟合生存树
- jakarta-ee - Swagger 2.x JaxrsAnnotationScanner 找不到位于 ear 中的资源类
- r - 在 R Markdown KNITR 中获取错误消息
- java - 如何在java中使用不推荐使用的导入?
- javascript - 如何阅读代码中的功能描述?
- c - 我想在不使用字符串函数的情况下反转 c 中的字符串并更正字符串?
- c# - c# Word COMException (0x800A11FD) 向文档添加新字段时
- javascript - 如何从javascript填充表格