【问题标题】:`...ByKey()` returns null in Kotlin flatbuffers impl`...ByKey()` 在 Kotlin flatbuffers impl 中返回 null
【发布时间】:2021-04-23 13:23:05
【问题描述】:

我有以下架构:

...
table FiltersByDomain {
  domain: string (key);
  filters: [FilterIsIncluded] (required);
}

table Index {
  ...
  filters_by_domain: [FiltersByDomain];
   ...
}

root_type Index;

当我通过索引使用 getter 并收集键时,我能够找到一些值:

        val domains = mutableMapOf<String, Int>()
        for (i in 0 until index.filtersByDomainLength) {
            val pair = index.filtersByDomain(i)!!
            domains[pair.domain!!] = pair.filtersLength
        }
        assertTrue(domains.keys.contains("scifinow.co.uk"))
        val someDomain = "dcw50.com"
        assertEquals(3, domains[someDomain]) // succeeds

如果我使用生成的..ByKey 方法,它会返回null

        assertEquals(3, index.filtersByDomainByKey(someDomain)!!.filtersLength) // fails

这是test(在 Android 上)。

PS。 使用api 'com.google.flatbuffers:flatbuffers-java:1.12.0',使用flatc --kotlin -o ../java schema.fbs生成文件

PPS。出于好奇,我尝试使用flatc --java -o ../java schema.fbs Java 类生成,但它也失败了。

> flatc --version
flatc version 1.12.0

【问题讨论】:

  • 您确定filters_by_domain 是按排序顺序序列化的吗?序列化这些数据的代码在哪里?
  • @aardappel 在序列化之前没有排序(并且代码在这个 repo 之外(但仍在我的控制之下))。需要排序吗?
  • 是的,这是一个二分搜索。
  • 预计在加载过程中进行排序,而不是保存。它是否记录为某处的要求?
  • @Aardappel 随时将您的评论转换为答案,我会接受。

标签: java android kotlin flatbuffers


【解决方案1】:

包含表的向量需要在序列化之前按key 字段进行排序,以便使用ByKey 方法进行查找(它被实现为二进制搜索,因为FlatBuffers 在就地零拷贝中格式,查找也发生在原地,而不是在目的地构造字典)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多