我拼凑了下面没有做任何复杂事情的代码 - 只创建一个byte []变量,将其写入Cassandra(v1.2,通过新的Datastax CQL库)的blob字段中,然后将其读回再来一次.
当我把它放在它的3个元素长,当我读回它时,它是84个元素长...!这意味着我实际上尝试做的事情(序列化Java对象)org.apache.commons.lang.SerializationException: java.io.StreamCorruptedException: invalid stream header: 81000008在尝试再次反序列化时失败并出现错误.
这是一些演示我的问题的示例代码:
import java.nio.ByteBuffer;
import org.apache.commons.lang.SerializationUtils;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
public class TestCassandraSerialization {
private Cluster cluster;
private Session session;
public TestCassandraSerialization(String node) {
connect(node);
}
private void connect(String node) {
cluster = Cluster.builder().addContactPoint(node).build();
Metadata metadata = cluster.getMetadata();
System.out.printf("Connected to %s\n", metadata.getClusterName());
for (Host host: metadata.getAllHosts()) {
System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n",
host.getDatacenter(), host.getAddress(), host.getRack()); …Run Code Online (Sandbox Code Playgroud) 我尝试了数据类型blob.这给了一些Datastax例外.我尝试了对象本身,bytearray.仍然没有好处:
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Invalid STRING constant ([B@547248ad) for user_object of type blob
Run Code Online (Sandbox Code Playgroud)
这是失败的INSERT:
executeSting.append("INSERT INTO htadb.objecttable (object_id, bucket_name, object_key, link, user_status, user_object) ")
.append("VALUES (")
.append(objectId).append(",'")
.append(bucketName).append("','")
.append(key).append("','")
.append(link).append("','")
.append("online").append("','")
.append(serializer(register)).append("')"
+ ";");
Run Code Online (Sandbox Code Playgroud)