我需要使用Java代码将Byte Array
值写入Cassandra。然后我将使用我的C ++程序从Cassandra读取相同的Byte Array
数据。
该字节数组由三个字节数组组成,如下所述 -
short schemaId = 32767;
long lastModifiedDate = "1379811105109L";
byte[] avroBinaryValue = os.toByteArray();
现在,我将schemaId
,lastModifiedDate
和avroBinaryValue
一起写入单个Byte Array
并生成字节数组,我会写回Cassandra然后我会拥有我的C ++程序,它将从Cassandra中检索字节数组数据,然后反序列化它以从中提取schemaId
,lastModifiedDate
和avroBinaryValue
。
所以现在我很困惑在写入Cassandra时我是否应该在我的Java代码中使用Big Endian?或者在将数据存储到Cassandra时将小Endian字节顺序放在这里?
下面是代码,我到目前为止已经用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中执行此操作,因为我需要使用C ++程序从Cassandra检索此数据,所以我不希望在C ++方面也有任何问题..所以我试图确保当我从Java端向Cassandra写这些数据时,一切看起来都不错..
现在,为了测试我正在做的事情 - 我正在将这个字节数组写入Java程序的文件中,我正在使用C ++程序读取同一个文件,然后相应地反序列化该字节数组。
我希望我的问题很清楚..任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
为什么不使用像google protobuf(http://code.google.com/p/protobuf/)这样的序列化框架,这样你就不必担心低级别的细节以及从任何语言和工具中读写回写