#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[]).