Мне нужно написать Byte Array
значение в Cassandra с использованием кода Java. Тогда у меня будет программа на С ++, чтобы читать то же самое Byte Array
данные от Кассандры.
Этот байтовый массив состоит из трех байтовых массивов, как описано ниже:
short schemaId = 32767;
long lastModifiedDate = "1379811105109L";
byte[] avroBinaryValue = os.toByteArray();
Сейчас напишу schemaId
, lastModifiedDate
а также avroBinaryValue
вместе в один Byte Array
и что в результате этого Byte Array я напишу обратно в Cassandra, а затем у меня будет программа на C ++, которая будет извлекать данные Byte Array из Cassandra, а затем десериализовать их для извлечения. schemaId
, lastModifiedDate
а также avroBinaryValue
от него.
Так что теперь я запутался, должен ли я использовать Big Endian здесь в своем коде Java при записи в Cassandra? Или небольшой порядок байтов Endian здесь при сохранении данных в Cassandra?
Ниже приведен код, который я дошел до Java, который будет сериализовать все в однобайтовый массив …
public static void main(String[] args) throws Exception {
String os = "whatever os is";
byte[] avroBinaryValue = os.getBytes();
long lastModifiedDate = 1379811105109L;
short schemaId = 32767;
ByteArrayOutputStream byteOsTest = new ByteArrayOutputStream();
DataOutputStream outTest = new DataOutputStream(byteOsTest);
outTest.writeShort(schemaId); // first write schemaId
outTest.writeLong(lastModifiedDate); // second lastModifiedDate
outTest.writeInt(avroBinaryValue.length); // then attributeLength
outTest.write(avroBinaryValue); // then its value
byte[] allWrittenBytesTest = byteOsTest.toByteArray();
// write this allWrittenBytesTest into Cassandra
// now deserialize it and extract everything from it
DataInputStream inTest = new DataInputStream(new ByteArrayInputStream(allWrittenBytesTest));
short schemaIdTest = inTest.readShort();
long lastModifiedDateTest = inTest.readLong();
int sizeAvroTest = inTest.readInt();
byte[] avroBinaryValue1 = new byte[sizeAvroTest];
inTest.read(avroBinaryValue1, 0, sizeAvroTest);System.out.println(schemaIdTest);
System.out.println(lastModifiedDateTest);
System.out.println(new String(avroBinaryValue1));
}
И я также пытаюсь понять, существует ли какой-либо эффективный или правильный способ сделать это в Java, так как мне нужно получить эти данные из Cassandra с помощью программы C ++, поэтому я не хочу иметь никаких проблем и на стороне C ++. Так что Я пытаюсь убедиться, что когда я пишу эти данные в Cassandra со стороны Java, все выглядит хорошо ..
Прямо сейчас, для проверки того, что я делал, я записывал этот Byte Array в файл из программы Java, и я читал тот же файл с помощью программы C ++, а затем десериализовал этот Byte Array соответственно …
Я надеюсь, что мой вопрос достаточно ясен .. Кто-нибудь может мне помочь с этим?
Почему бы не использовать фреймворк по поиску подходов, такой как google protobuf (http://code.google.com/p/protobuf/) таким образом вам не нужно беспокоиться о деталях низкого уровня, а также читать и писать на любом языке и инструментах
Других решений пока нет …