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)
现在的系统可以解决这个问题吗?
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |