问题描述
这是我第一次使用 protobuf 和 jetpack 的 DataStore,但我遇到了一个非常令人困惑的问题。
我已经在 src/main/java/proto 中创建了我的 .proto 文件,它真的很简单:
Syntax = "proto3";
option java_package = "com.test.appname.proto";
option java_multiple_files = true;
message WalkInfo {
float distance = 1;
bool run = 2;
}
然后我在 kotlin 中为我的应用程序中的一些数据编写了一个序列化器类。
object WalkInfoSerializer : Serializer<Walker.WalkInfo>{
override val defaultValue: Walker.WalkInfo
get() = WalkInfo.getDefaultInstance()
override fun readFrom(input: InputStream): Walker.WalkInfo {
try {
return WalkInfo.parseFrom(input)
} catch (exception: InvalidProtocolBufferException) {
throw CorruptionException("Cannot read proto.",exception)
}
}
override fun writeto(t: Walker.WalkInfo,output: OutputStream) {
t.writeto(output)
}
}
我也像这样设置了我的 build.gradle 文件:
plugins {
id 'com.android.application'
id 'kotlin-android'
id "com.google.protobuf" version "0.8.14"
}
...
dependencies {
...
//DataStore
implementation "androidx.datastore:datastore:1.0.0-alpha05"
implementation 'com.google.protobuf:protobuf-javalite:3.14.0'
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.10.0"
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option 'lite'
}
}
}
}
}
一切正常,类似乎正确生成,它们甚至在 android studio 的自动完成中弹出。 问题是我无法编译项目,因为我似乎无法找到一种方法来解决生成的方法的“未解析引用”(例如 getDefaultInstance()、parseFrom()、writeto() 即使编写完整的类路径也行不通。
我错过了什么吗?我尝试使用 build.gradle 和 proto 文件以及我在他们的文档中找到的一些设置,但我仍然无法让它工作
谢谢!
解决方法
睡觉,醒来,知道我的问题的答案。 愚蠢的大脑设法在晚上做 1 + 1。
我意识到如果要生成原型类,我不应该自己在 kotlin 代码中定义它们。
我有一个生成 WalkInfo 类的 WalkInfo 消息,但我也有一个 WalkInfo 类,其中已经包含一些方法。这就是让编译器感到困惑的地方。
经过进一步研究,我意识到 proto 生成的类甚至不打算扩展,它们应该只是数据容器。
我最终做的是将我的消息重命名为 WalkInfoStorage,同时保留我的 WalkInfo kotlin 类,然后我将处理从序列化数据生成 WalkInfo 实例