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

原型数据存储-嵌套类型

柏夕
2023-03-14

好吧,我一直在Kotlin试验原始数据存储,我有一个问题。我正在使用以下内容。原型文件:

syntax = "proto3";

option java_package = "com.example.protodatastore";
option java_multiple_files = true;

    message Person{
      string name = 1;
      int32 age = 2;
      message Address{
        string street = 3;
        int32 number = 4;
      }
      Address address = 5;
    }

这是我的序列化程序类:

class MyPreferencesSerializer: Serializer<Person> {
    override fun readFrom(input: InputStream): Person {
        try {
            return Person.parseFrom(input)
        }catch (exception: InvalidProtocolBufferException){
            throw CorruptionException("Cannot read proto.", exception)
        }
    }

    override fun writeTo(t: Person, output: OutputStream) {
        t.writeTo(output)
    }
}

和我的存储库:

class MyPreferencesRepository(context: Context) {

    private val dataStore: DataStore<Person> = context.createDataStore(
        "my_pref",
        serializer = MyPreferencesSerializer()
    )

    val readProto: Flow<Person> = dataStore.data
        .catch { exception ->
            // dataStore.data throws an IOException when an error is encountered when reading data
            if (exception is IOException) {
                Log.e("TAG", exception.message.toString())
                emit(Person.getDefaultInstance())
            } else {
                throw exception
            }
        }

    suspend fun updateValue(name: String){
        dataStore.updateData {preferences->
            preferences.toBuilder().setName(name).build()
        }
    }

}

因此,在我的updateValue()方法中,我可以设置“name”字段的名称,但我没有地址消息字段的setter,如street和number。编译器只显示getter。在姓名和年龄字段的另一边,我有setters。如何对这两个地址字段使用setters:街道、编号?

还有一个问题。所以基本上使用Proto DataStore,我们正在序列化/反序列化我们的自定义对象及其所有字段,而不仅仅是字符串、int等单一原始类型?

共有1个答案

姜淇
2023-03-14

如何为这两个地址字段使用设置器:街道、号码?

您的代码看起来不错,请尝试清洁Rebuild project,因为proto在编译时生成类

还有一个问题。所以基本上使用Proto DataStore,我们正在序列化/反序列化我们的自定义对象及其所有字段,而不仅仅是字符串、int等单一原始类型?

是的,Proto DataStore非常适合小型或简单的数据集,不支持部分更新或引用完整性。由于它使用序列化/反序列化来写入/读取数据,因此会产生性能问题。

如果要存储大型复杂对象,请使用“房间”。

我观察到的关于原始数据存储的一些令人痛苦的事情:

  • 为每个要保存的对象创建序列化程序
  • 为每个对象创建Schema(额外的工作)
  • 我找不到任何解决方案构建一个我可以在任何地方使用的泛型类。
  • 每当您更改模式时,您都必须重建项目等...
 类似资料:
  • 15/09/16 16:44:39 ERROR Executor:stage 1.0(TID 1)中任务0.0中的异常java.lang.IllegalArgumentException:应重复嵌套类型:required group array{required int32 num;}在org.apache.parquet.schema.conversionPatterns.listWrapper

  • 如何在PySpark中更改嵌套列的datatype?对于rxample,如何将value的数据类型从string更改为int? 参考:如何在pyspark中将Dataframe列从String类型更改为Double类型

  • 本页包含内容: 嵌套类型实例 嵌套类型的引用 枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义嵌套类型,可以在枚举类型、类和结构体中定义支持嵌套的类型。 要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。 嵌套类型实例 下面这个例子定义了一个结

  • 问题内容: 使用redux更新商店中嵌套数据数组的最佳/正确方法是什么? 我的商店看起来像这样: 我有一对异步操作来更新完整的对象,但是我还有另一对操作要更新特定的数组。 我的减速器当前看起来像这样,但是我不确定这是否是正确的方法: 问题答案: React的不变性帮助器是一种创建普通旧JavaScript对象的更新版本而无需对其进行突变的便捷方法。 您为它提供了要更新的源对象和一个对象,该对象描述

  • 问题内容: 所以我的问题是,我在Android(Java)上编写了一个函数,该函数需要两个Double,两个Int和一个Calendar对象。我相信提供的允许它在单独的线程中运行的类AsyncTask仅接受一种类型的Object(但允许多种)作为参数,因此我认为我可以将其放入List或LinkedList或其他内容中。 是否存在允许多个数据类型()的类型,还是我必须创建自己的对象类?我是一个新手程

  • 只使用一个集合很好,但是我需要编辑外部窗体的原型,所以它为每一行呈现内部窗体的原型。 你知道我该怎么做吗?还有什么是最好的储蓄方式 编辑:现在我正在尝试呈现嵌套窗体的原型: 促销特征选择类型 第一级原型,工作很好。