Сохраните класс данных в хранилище данных protobuf.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сохраните класс данных в хранилище данных protobuf.

Сообщение Anonymous »

Я работаю над приложением, которое получает данные от конечной точки. Раньше я сохранял резервную копию этих данных в общих настройках, но, поскольку объект сложен, сериализация JsonToString и StringToJson неэффективна, особенно при обновлении класса данных. Если приложение обновлено с использованием обновленного класса данных, но предыдущее приложение все еще содержит старые данные, хранящиеся в общих настройках, я заметил некоторую проблему с их правильным извлечением. Несмотря на то, что с ним легко играть, хранилище данных protobuf является лучшим подходом, поскольку я бы сказал, что это хорошее решение между использованием общих настроек и использованием базы данных.
Однако я сталкиваюсь с ошибками в сложных объектах. Я подозреваю, что это соглашение об именах и/или ошибки в моем подходе.
Класс данных, используемый модификацией для сериализации Json, выглядит следующим образом:

Код: Выделить всё

data class Order(
val id: Int,
val name: String,
val items: List
)

data class Item(
val id: Int,
val name: String,
val description: String,
val address: Address
)

data class Address(
val address: String
val zip: String
)
Чтобы хранилище данных protobuf работало, я создал файл прототипа:

Код: Выделить всё

syntax = "proto3";

option java_package = "com.mcdonalds.app";
option java_multiple_files = true;

message LastOrder {
Order order = 1;
}

message Order {
int32 id = 1;
string name = 2;
repeated Item items = 3;
}

message Item {
int32 id = 1;
string name = 2;
string description = 3;
Address address = 4;
}

message Address {
string address = 1;
string zip = 2;
}

Итак, класс LastOrder начал генерироваться, но он жалуется на Order. Я предполагаю, что это конфликт между классом данных Order и Order в файле прототипа. Я также изо всех сил пытаюсь понять, как произошло преобразование класса данных в прототип и наоборот. Я привык к сериализации/десериализации JsonToString и StringToJson.
Я создал эту функцию:

Код: Выделить всё

override suspend fun saveLastOrder(order: Order) {
try {
lastOrderStore.updateData { lastOrder ->
lastOrder.toBuilder().setOrder(order).build()
}
} catch (e: IOException) {
Log.e(TAG, "Save Last Order Exception: " + e.message)
}

}

но я не уверен, что хранилище данных сможет сопоставить все остальные классы, просто передав порядок.
У меня есть этот класс сериализатора:

Код: Выделить всё

object LastOrderSerializer : Serializer {
override val defaultValue: LastOrder
get() = LastOrder.getDefaultInstance()

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

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

Есть идеи о том, как сохранить сложный класс данных в хранилище данных?
Я нашел пример с использованием строки, int... но никогда для сложного объекта.

Подробнее здесь: https://stackoverflow.com/questions/790 ... data-store
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»