0

我们目前使用 bitset 来表示一系列工作块的状态,在我们的 Java 代码中,每个工作块都可以是成功或失败。所以我们想在 Oracle NoSQl 中找到最节省空间的类型来转换。我们认为最好的解决方案是使用二进制,但是在尝试插入数据时我们遇到了以下问题

Caused by: java.lang.IllegalArgumentException: 
PUT: Illegal Argument: Invalid driver type for Binary: ARRAY

事实上,我不知道如何将二进制对象发送到 Oracle NoSQL 数据库,有什么想法吗?

如果您需要有关 BitSet 的信息,请阅读

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/BitSet.html

4

2 回答 2

0

如果您正在为您的 Java 对象进行 JSON 序列化/反序列化。这是一个向您展示如何将 BitSet 转换为 base64 的示例。JSON 中的二进制存储在 base64 中。

import java.util.BitSet;
import java.util.Base64;

public class HelloWorld {
public static void main(String[] args) {
// Creating some examples of BitSet
BitSet first = new BitSet();
first.set(2); // 100
BitSet second = new BitSet();
second.set(4); // 10000
second.set(3); // 11000
BitSet third = new BitSet(2000);
third.set(5, 49);

// from Bitset to Base64
byte[] encoded = Base64.getEncoder().encode(first.toByteArray());
System.out.println("first="+first);
System.out.println("{'Chunk':'" +new String(encoded) + "'}");

encoded = Base64.getEncoder().encode(second.toByteArray());
System.out.println("second="+second);
System.out.println("{'Chunk':'" +new String(encoded) + "'}");
encoded = Base64.getEncoder().encode(third.toByteArray());

System.out.println("third="+third);
System.out.println("{'Chunk':'" +new String(encoded) + "'}");

// from Base64 to Bitset

byte[] decoded = Base64.getDecoder().decode("4P8H");
BitSet four = BitSet.valueOf(decoded);
System.out.println("four="+four);

decoded = Base64.getDecoder().decode(encoded);
BitSet thirdDecoded = BitSet.valueOf(decoded);
System.out.println("{'Chunk':'" +new String(encoded) + "'}");

System.out.println("third="+thirdDecoded);

}

}

输出 BitSet 为 base64

first={2}
{'successfulChunkMask':'BA=='}
second={3, 4}
{'successfulChunkMask':'GA=='}
third={5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}
{'successfulChunkMask':'4P//////AQ=='}

输出 base64 到 BitSet

4P8H in base64
four={5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
{'successfulChunkMask':'4P//////AQ=='}

third={5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}

如果您使用 NoSQL Java MapValue API(而不是对象的 JSON 表示),则需要从 byte[] 转换为 Bitset,反之亦然,并且不需要通过 base64。请参阅提供的代码中的 toByteArray() 和 BitSet.valueOf(byte[])。

如果您使用 NoSQL API 插入数据并提供 JSON 值,则解决方案是 base64 编码二进制字段 (java.util.BitSet)。如果您使用的是 SQL API,则相同

于 2021-07-01T11:58:40.013 回答
0

您可以使用 BitSet.toByteArray() 创建一个 byte[] 数组,然后将其直接放入 Oracle NoSQL FieldValue,然后您可以使用 put() 将其写入 NoSQL 数据库:

final FieldValue val = new BinaryValue(mybits.toByteArray());

从 Oracle NoSQL 读取值时,您可以通过调用 BitSet.valueOf(byte[]) 生成返回的位集。

于 2021-10-18T20:42:07.100 回答