当前位置: 首页 > 知识库问答 >
问题:

如何序列化/反序列化Long[]值与get/set随机索引使用编年史映射?

陶高峻
2023-03-14

通过阅读文档,我了解到对于键,我可以使用值类型ShortValue并重用该接口实现的实例。关于值,我找到了一个讨论DataAccess和SizedReader的页面,它给出了byte[]的示例,但我不确定如何将其适应长[]。我有一个额外的要求是,我需要在长数组中的任意索引处获取和设置值,而不需要每次对整个值进行完整的序列化/反序列化。

所以我的问题是:在构造映射时,我如何建模值类型,如果每个映射的最大大小是已知的,并且我需要能够读写随机索引,而不需要每次对整个值负载进行序列化/反序列化,那么对于一个长的[]数组,我需要什么序列化/反序列化代码?理想情况下,长[]将直接编码/解码到off堆/从off堆,而不经历on堆到Byte[]的中间转换,而且编年史映射代码不会在运行时分配。谢谢你。

共有1个答案

苏磊
2023-03-14

首先,我建议使用某种longlist接口抽象而不是long[],这样可以更容易地处理大小的可变性,提供替代的flyweight实现,等等。

如果您只想读/写大列表中的单个元素,您应该使用高级上下文API:

/** This method is entirely garbage-free, deserialization-free, and thread-safe. */
void putOneValue(ChronicleMap<ShortValue, LongList> map, ShortValue key, int index,
        long element) {
    if (index < 0) throw throw new IndexOutOfBoundsException(...);
    try (ExternalMapQueryContext<ShortValue, LongList, ?> c = map.getContext(key)) {
        c.writeLock().lock(); // (1)
        MapEntry<ShortValue, LongList> entry = c.entry();
        if (entry != null) {
            Data<LongList> value = entry.value();
            BytesStore valueBytes = (BytesStore) value.bytes(); // (2)
            long valueBytesOffset = value.offset();
            long valueBytesSize = value.size();
            int valueListSize = (int) (valueBytesSize / Long.BYTES); // (3)
            if (index >= valueListSize) throw new IndexOutOfBoundsException(...);
            valueBytes.writeLong(valueBytesOffset + ((long) index) * Long.BYTES,
                element);
            ((ChecksumEntry) entry).updateChecksum(); // (4)
        } else {
            // there is no entry for the given key
            throw ...
        }
    }
}

备注:

    null
 类似资料:
  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)

  • FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的

  • 上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能

  • 目前,我正在使用Avro1.8.0序列化/反序列化对象,但面临一些问题,特别是java.util.Map对象。不面临其他类型对象的问题。 这里的示例代码- 在deserialize方法中,我试图根据输入数据获取模式,但avro抛出错误- 多谢了。

  • 如何将jackson JSON映射器与Java 8 LocalDateTime一起使用? JSONMappingException:无法从JSON字符串实例化类型[simple type,class java.time.LocalDateTime]的值;没有单字符串构造函数/工厂方法(通过引用链:mydto[“field1”]->subdto[“date”])