通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

2024-03-04

我拼凑了下面的代码,它没有做任何复杂的事情——只是创建一个 byte[] 变量,将其写入 Cassandra 中的 blob 字段(v1.2,通过新的 Datastax CQL 库),然后将其读回又出来了。

当我把它放进去时,它是 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());
        }
        session = cluster.connect();
    }

    public void setUp() {
        session.execute("CREATE KEYSPACE test_serialization WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};");

        session.execute("CREATE TABLE test_serialization.test_table (id text PRIMARY KEY, data blob)");
    }

    public void tearDown() {
        session.execute("DROP KEYSPACE test_serialization");
    }

    public void insertIntoTable(String key, byte[] data) {
        PreparedStatement statement = session.prepare("INSERT INTO test_serialization.test_table (id,data) VALUES (?, ?)");
        BoundStatement boundStatement = new BoundStatement(statement);
        session.execute(boundStatement.bind(key,ByteBuffer.wrap(data)));
    }

    public byte[] readFromTable(String key) {
        String q1 = "SELECT * FROM test_serialization.test_table WHERE id = '"+key+"';";

        ResultSet results = session.execute(q1);
        for (Row row : results) {
            ByteBuffer data = row.getBytes("data");
            return data.array();
        }
        return null;
    }


    public static boolean compareByteArrays(byte[] one, byte[] two) {
        if (one.length > two.length) {
            byte[] foo = one;
            one = two;
            two = foo;
        }

        // so now two is definitely the longer array    
        for (int i=0; i<one.length; i++) {
            //System.out.printf("%d: %s\t%s\n", i, one[i], two[i]);
            if (one[i] != two[i]) {
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {
        TestCassandraSerialization tester = new TestCassandraSerialization("localhost");

        try {
            tester.setUp();
            byte[] dataIn = new byte[]{1,2,3};
            tester.insertIntoTable("123", dataIn);
            byte[] dataOut = tester.readFromTable("123");

            System.out.println(dataIn);
            System.out.println(dataOut);

            System.out.println(dataIn.length); // prints "3"
            System.out.println(dataOut.length); // prints "84"

            System.out.println(compareByteArrays(dataIn, dataOut)); // prints false         

            String toSave = "Hello, world!";
            dataIn = SerializationUtils.serialize(toSave);
            tester.insertIntoTable("toSave", dataIn);
            dataOut = tester.readFromTable("toSave");

            System.out.println(dataIn.length); // prints "20"
            System.out.println(dataOut.length); // prints "104"


            // The below throws org.apache.commons.lang.SerializationException: java.io.StreamCorruptedException: invalid stream header: 81000008
            String hasLoaded = (String) SerializationUtils.deserialize(dataOut); 
            System.out.println(hasLoaded);

        } finally {
            tester.tearDown();
        }
    }
}

看起来正确的内容已进入数据库:

cqlsh:flight_cache> select * from test_serialization.test_table;

 id     | data
--------+--------------------------------------------
    123 |                                   0x010203
 toSave | 0xaced000574000d48656c6c6f2c20776f726c6421

cqlsh:flight_cache> 

因此,在读取而不是写入二进制数据时,它看起来像是一个错误。谁能告诉我我做错了什么?


问题几乎肯定是因为 ByteBuffer.array() 返回的数组是完整的后备数组,但数据可能只包含在其中的一部分中。

返回的有效数据从 ByteBuffer.arrayOffset() 开始,长度为 ByteBuffer.remaining()。要获取仅包含有效数据的字节数组,请在 readFromTable 中使用以下代码:

byte[] result = new byte[data.remaining()];
data.get(result);

那么你的数据就在结果中,你可以返回它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 如何通过字符串或整数获取枚举值

    如果我有枚举字符串或枚举 int 值 如何获取枚举值 例如 如果我有一个枚举如下 public enum TestEnum Value1 1 Value2 2 Value3 3 在某些字符串变量中 我的值 value1 如下 string
  • 我想找到线程消息并使用 slack-api 删除它

    可以通过以下方法找到私信或私信im history and converstation history 如何查找话题消息 我想找到线程消息并删除它们 查找话题消息 您需要使用conversations history https api s
  • jQuery 验证插件 - 如何在页面加载时显示标签

    填写输入后 该插件会插入一个标签 但是我希望在页面加载时插入所有标签 任何想法都会很棒 谢谢 该插件的链接在这里 http jqueryvalidation org documentation http jqueryvalidation o
  • 如何计算列表中点的距离?

    我有两组列表 A 和 O 它们都有来自 x y z 坐标的点 我想计算A点和B点之间的距离 我使用了for循环 但它只给了我一个结果 它应该从结果中给出 8 个数字 我很感激有人能看一下 这是我的项目的最后一步 Ax 232 34 233
  • 如何设置 Eclipse 工作区机制来共享设置?

    我该如何配置这个工具 我已经在 Eclipse 环境中设置了首选项 底部图标显示工作区机制正常 但是 当我打开工作区或创建新工作区时 没有任何反应 没有任何首选项 如何设置工作区机制 以及如何告诉工作区使用另一个工作区的设置 默认情况下 工
  • 在面向对象编程中,null 的最佳替代方案是什么?

    我觉得不满意在面向对象编程中 有其他解决方案吗 我不喜欢避免它this way http en wikipedia org wiki Null Object pattern either 最好的处理方法是什么 Java 8 有新的Optio
  • 在 Rails 中使用部分的最佳实践

    为了与 DRY 原则保持一致 当我重复某个特定模式超过一两次时 我会尝试使用部分模式 结果 我的一些观点由十个或更多不同的部分组成 我担心这可能会对整体表现产生负面影响 一些编程书籍将部分的使用与方法的使用进行比较 那么我应该使用相同的理由
  • 应用 CSS3 缩放时可排序行为错误

    我正在使用 CSS 转换缩放 JQuery 可排序元素 拖动时可排序项目的起始位置和偏移量都是错误的 因为 JQuery 不考虑 CSS 比例 我用这里找到的代码部分解决了这个问题 jQuery 拖动 使用 CSS 变换比例调整大小 htt
  • JSF2.0的宽度如何设置?

    代码 div div
  • 单个查询中多个日期范围的总和?

    我有以下查询 SELECT SUM balance transactions fee AS sum id FROM balance transactions JOIN charges ON balance transactions sour
  • Objective-C 插件架构安全性(Mac,不是 iPhone)

    我可能正在为 Cocoa 应用程序 Mac 而不是 iPhone 编写一个插件系统 一种常见的方法是将每个插件打包为一个包 然后将该包注入到主应用程序中 我担心这样做的安全隐患 因为捆绑包将具有对 Objective C 运行时的完全访问权
  • 查找数组中的最小值[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有两个数组 int playerSums 9 string playerNames 9 我正在尝试获取最小值在数组中p
  • 网站的 A/B 测试是什么意思?

    请解释 举例 网站 A B 测试的含义 在网站上下文中 这意味着该网站 网络应用程序的某些用户获得slightly修改版本 并验证与基线 控制 版本相比 每个修改如何影响可用性 用户行为 与往常一样 A B 测试是一种统计技术 您需要足够大
  • 使用哪些 C# AES 加密选项以便可以在公共网站上解密结果? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想使用类似于下面的代码来加密字符串 并能够使用公开网站 例如其中一个网站 对其进行解密 但也对其他一些网站开放 htt
  • 用户窗体工具箱附加控件对话窗口未显示

    在使用 MS Excel 显然还有 Outlook Word 或 Power Point 时 我创建了一个用户表单 工具箱显示控件选项卡和代表各种控件的 16 个图标 当我右键单击工具箱控制区域中的某个空白区域时 会出现一个菜单 其中在顶部
  • 如何存储然后检索父子依赖性数据(Maya MEL/Python 脚本)

    我有一个需要的层次结构 分开 做一点事 按照以前的方式将其重新组装起来 我确实知道如何打破事物 并且对当层次结构扁平时我需要做什么有计划 问题是我如何养育他们 Details 这与我之前的问题有关 冻结带有动画子对象的父对象的缩放变换 MA
  • 在 Android 帐户管理器中存储其他数据

    我想使用安卓AccountManager但是 要同步我的网络服务和应用程序 联系人和日历的标准同步 AccountManager似乎只存储用户名和密码 我的 Web 服务需要三个凭据 用户名 密码和帐户 存储第三条信息的最佳实践是什么 正如
  • JPA - 事务未提交

    我正在开发一个项目 在该项目中我第一次使用 JPA Hibernate 和所有这些东西 但我遇到了事务未提交的问题 我使用类 User 如下所示 package org tomasherman JBTBackup Resource Enti
  • 通过正则表达式限制文本中的行数

    在任何编程语言中 我都知道如何有效地限制给定文件或字符串中的行数 这不是这里的问题 然而在这种情况下 我希望通过正则表达式来做到这一点 在这个模式中我只使用 n 换行符 我不需要其他人 例如 r 回车 n n 0 3 上面的正则表达式解释如
  • 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

    我拼凑了下面的代码 它没有做任何复杂的事情 只是创建一个 byte 变量 将其写入 Cassandra 中的 blob 字段 v1 2 通过新的 Datastax CQL 库 然后将其读回又出来了 当我把它放进去时 它是 3 个元素长 当我