我目前正在使用Apache Cassandra(Cassandra版本:1.2.3,Thrift API版本:19.35.0,CQL支持版本:2.0.0,3.0.1(默认值:3.0.1))和Hector 1.0.5。
我使用以下代码插入和检索对象。
String cf="User";
key="myKey";
String colName="colName";
String colValue="colvalue";
Mutator<String> mutator = HFactory.createMutator(keyspace, StringSerializer.get());
mutator.insert(key, cf, HFactory.createStringColumn(colName, colValue));
ColumnQuery<String, String, Object> columnQuery = HFactory.createColumnQuery(
keyspace,
StringSerializer.get(),
StringSerializer.get(),
ObjectSerializer.get());
columnQuery.setColumnFamily(cf).setKey(key).setName(colName);
QueryResult<HColumn<String, Object>> r = columnQuery.execute();
System.out.println("Read HColumn from cassandra: " + r.get());
但我得到以下例外:
Exception in thread "main" me.prettyprint.hector.api.exceptions.HectorSerializationException: java.io.StreamCorruptedException: invalid stream header: 636F6C76
at me.prettyprint.cassandra.serializers.ObjectSerializer.fromByteBuffer(ObjectSerializer.java:79)
at me.prettyprint.cassandra.model.HColumnImpl.getValue(HColumnImpl.java:124)
at me.prettyprint.cassandra.model.HColumnImpl.toString(HColumnImpl.java:202)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at org.dargamenteria.tfg.texu.logic.UserDAOImpl.create(UserDAOImpl.java:111)
但是下面的代码可以工作,只是将ObjectSerializer更改为StringSerializer:
Mutator<String> mutator = HFactory.createMutator(keyspace, StringSerializer.get());
mutator.insert(key, cf, HFactory.createStringColumn(colName, colValue));
ColumnQuery<String, String, String> columnQuery = HFactory.createColumnQuery(
keyspace,
StringSerializer.get(),
StringSerializer.get(),
StringSerializer.get());
columnQuery.setColumnFamily(cf).setKey(key).setName(colName);
QueryResult<HColumn<String, String>> r = columnQuery.execute();
System.out.println("Read HColumn from cassandra: " + r.get());
答案 0 :(得分:1)
如果您查看Hector Serializer层次结构,您会发现ObjectSerializer&amp; StringSerializer都是兄弟姐妹,都实现了Serializer接口和扩展AbstractSerializer类。
StringSerializer中的fromByteBuffer 方法需要一个字符串,而在ObjectSerializer中它需要一个对象。在您的代码中,您已将列值定义为字符串类型,因此您必须使用StringSerializer,因为您的代码集期望String类型。
答案 1 :(得分:0)
首先,感谢Abhi的回答:)你提供了一些重要的线索。
我所做的是使用正确的序列化器插入ByteBuffers。 例如
mutator.addInsertion(key, columnFamilyName,
HFactory.createColumn("name",
ByteBufferSerializer.get().fromByteBuffer(StringSerializer.get().toByteBuffer(uh.getName())),
StringSerializer.get(),
ByteBufferSerializer.get())).
addInsertion(key, columnFamilyName,
HFactory.createColumn("email",
ByteBufferSerializer.get().fromByteBuffer(ObjectSerializer.get().toByteBuffer(uh.getEmail())),
StringSerializer.get(),
ByteBufferSerializer.get())).
并检索它们,例如
StringSerializer.get().fromByteBuffer(
r.get().getColumnByName("name").getValue())
谢谢大家!