チュートリアルを参考にして作成したカスタムコーデック-https://docs.datastax.com/en/latest-java-driver/java-driver/reference/customCodecs.htmlを定義しました。ここに私のコーデックimpelementationがある: -Java Cassandra Datastaxドライバのカスタムコーデックでコレクションタイプが処理されない
package org.questqa.server.database.codecs;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import org.questqa.server.database.fetchers.UserInfoFetcher;
import org.questqa.server.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import com.datastax.driver.core.DataType;
import com.datastax.driver.core.ProtocolVersion;
import com.datastax.driver.core.TypeCodec;
import com.datastax.driver.core.exceptions.InvalidTypeException;
public class UserCodec extends TypeCodec<User>
{
@Autowired
UserInfoFetcher userFetcher;
public UserCodec(DataType cqlType, Class<User> javaClass)
{
super(cqlType, javaClass);
}
@Override
public User deserialize(ByteBuffer buffer, ProtocolVersion arg1) `throws InvalidTypeException {`
// TODO Auto-generated method stub
System.out.println("Executing deserialize");
User user = new User();
try {
System.out.println("Size of ByteBuffer: " + `buffer.array().length);`
String userId = new String(buffer.array(), "UTF-8");
System.out.println("User id to set: " + userId);
System.out.println("Setting user id...");
user.setUserId(userId);
System.out.println("User id set: " + user.getUserId());
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}
@Override
public String format(User user) throws InvalidTypeException
{
System.out.println("Executing format");
return user.getUserId();
}
@Override
public User parse(String userId) throws InvalidTypeException
{
// TODO Auto-generated method stub
System.out.println("Executing parse");
User user = new User();
user.setUserId(userId);
return user;
}
@Override
public ByteBuffer serialize(User user, ProtocolVersion arg1) throws `InvalidTypeException {`
// TODO Auto-generated method stub
System.out.println("Executing serialize");
ByteBuffer buffer = null;
System.out.println("Userid to serialize: " + user.getUserId());
try {
buffer = ByteBuffer.wrap(user.getUserId().getBytes("UTF-8"));
String bufferStr = new String(buffer.array(), "UTF-8");
System.out.println("ByteBuffer to be returned: \nLength: " + `buffer.array().length +`
"\nValue: " + bufferStr);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buffer;
}
}
基本的には、Serializeメソッドでは、私は(user.getUserId()を使用して)ユーザーIDの文字列を抽出した後、ユーザーID列として私のカサンドラテーブルに保管しようとしています。逆直列化では、指定されたByteBufferインスタンスを文字列に変換して返します。 これは、シリアライズ時にstring、set、listに対して完璧に機能します(つまり、Setを使用している場合、コーデックはsetの各要素に対してserialize()を実行し、対応する文字列をmy casandraテーブルに格納します)。しかし、cassandraのセットフィールドをデシリアライズする際、deserializeメソッドはByteBufferオブジェクトのセット全体を送信します。 ByteBufferオブジェクトを解析することで個々の要素がそこにあることがわかります。 deserializeは、セットのすべての要素に対して実行されることに注意してください。したがって、セットに5つの要素がある場合、deserializeは5回実行されますが、毎回、ByteBuffer内の特定の要素を送信する代わりに、セット全体が送信されます。 これがなぜやっているのかわからないし、Googleもそれほど助けになっていない。どんな提案/解決策も、私がかなり長い間これに取り組んでいたので、大歓迎です。
ありがとうございます!
ありがとうございました!それは本当に役に立ちました! –