как отправить двоичный объект в базу данных Oracle NoSQL?

#oracle-nosql

Вопрос:

В настоящее время мы используем набор битов для представления статуса ряда фрагментов работы, каждый из которых может быть успешным или неудачным в нашем Java-коде. Поэтому мы хотим найти наиболее экономичный тип для преобразования в Oracle NoSQL. Мы считаем, что лучшим решением является использование двоичного кода, но при попытке вставить данные мы сталкиваемся со следующей проблемой

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

На самом деле, я не знаю, как отправить двоичный объект в базу данных Oracle NoSQL, есть идеи?

Если вам нужна информация о наборе бит, пожалуйста, прочитайте

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

Ответ №1:

Если вы выполняете сериализацию/десериализацию в JSON для своих объектов Java. Вот пример, который покажет вам, как преобразовать из/в набор бит в 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);

}

}
 

выходной набор разрядов для 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=='}
 

выходная база 64 в битовый набор

 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}
 

Если вы используете API NoSQL Java mapValue (вместо представления объекта в формате JSON) , вам нужно преобразовать byte[] в Bitset и viceversa, и вам не нужно передавать base64. см. Раздел toByteArray() и BitSet.valueOf(байт[]) в предоставленном коде.

Если вы вставляете данные с помощью API NoSQL и предоставляете значение JSON, решением является base64 для кодирования ваших двоичных полей (java.util.BitSet). То же самое, если вы используете API SQL

Ответ №2:

Вы можете использовать BitSet.toByteArray() для создания массива байтов [], а затем поместить его непосредственно в значение поля Oracle NoSQL, которое затем можно записать в базу данных NoSQL с помощью функции put ().:

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

При чтении значения из Oracle NoSQL вы можете сгенерировать набор битов обратно, вызвав BitSet.valueOf(byte[]).