数据存储·链接序列化器/默认值

Kno*_*sos 6 android protobuf-java android-jetpack-datastore

核心问题是我想为子消息设置默认值。由于 proto3 不允许在 proto 文件中设置默认值。

示例 Protobuf

message Person {
  int32 age = 1;
  repeated Doggo doggos = 2;
}

message Doggo {
  int32 rating = 1;
}
Run Code Online (Sandbox Code Playgroud)

串行器示例

object PersonSerializer : Serializer<Person> {
    override val defaultValue: Person =
        Person.getDefaultInstance().toBuilder()
            .setAge(1)
            .build()

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

    override suspend fun writeTo(t: Person, output: OutputStream) {
        t.writeTo(output)
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以将所有 Person 的默认年龄设置为 1。标准值为0。

但是,我还需要将所有 Doggos 的评级设置为 10。这无法在此 Person 序列化器中完成。

我希望有一种方法可以为反序列化子项提供额外的序列化器。

这样的系统可能如下所示:

object PersonSerializer : Serializer<Person> {
    override val defaultValue: Person =
        Person.getDefaultInstance().toBuilder()
            .setAge(1)
            .build()

    override suspend fun readFrom(input: InputStream): Person {
        try {
            return Person.parseFrom(input,
                serializers = listOf(
                    DoggoSerializer
                )
            )
        } catch (exception: InvalidProtocolBufferException) {
            throw CorruptionException("Cannot read proto.", exception)
        }
    }

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

object DoggoSerializer : Serializer<Doggo> {
    override val defaultValue: Doggo =
        Doggo.getDefaultInstance().toBuilder()
            .setRating(10)
            .build()

    override suspend fun readFrom(input: InputStream): Doggo {
        try {
            return Doggo.parseFrom(input)
        } catch (exception: InvalidProtocolBufferException) {
            throw CorruptionException("Cannot read proto.", exception)
        }
    }

    override suspend fun writeTo(t: Doggo, output: OutputStream) {
        t.writeTo(output)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的系统可以解决这个问题吗?