DataStore- und Kotlin-Serialisierung von Simona Stojanovic Android-Entwickler Februar 2022

In den nächsten Beiträgen von uns Jetpack DataStore-ReiheWir behandeln einige zusätzliche Konzepte, um zu verstehen, wie der DataStore mit anderen APIs interagiert, sodass Sie alles zur Verfügung haben, um ihn zu verwenden Produktionsumfeld. In diesem Beitrag konzentrieren wir uns auf Kotlin-Serialisierung. Wir verweisen auf Einstellungen ich Proto Codelabs über diesen Beitrag für Codebeispiele.
In unseren vorherigen Beiträgen haben wir geschrieben, wie Einstellungen ich Proto DataStore-Ansatz zur Strukturierung und Serialisierung Ihrer persistenten Daten: Vorteile von Proto typisierte Objekte unterstützt Protokollpuffer, während Einstellungen verwendet Schlüssel/Wert-Paare wie unsere Datenanzeige, ähnlich wie SharedPreferences
. Unter der Haube, Beide Implementierungen speichern Daten unter Verwendung von Protokollpuffern auf der Festplatte in einer Datei. Aber der DataStore ermöglicht es Ihnen auch, dies anzupassen und auch Datenklassen zu verwenden Kotlin-Serialisierungdir geben Art des Sicherheitsvorteils Proto DataStore, aber ohne die Notwendigkeit, Protobuffs zu verwenden. Sehen wir uns an, wie die Serialisierung standardmäßig für jeden dieser Ansätze funktioniert:

Preferences DataStore vereinfacht die Arbeit mit Protobuffs durch Hinzufügen zusätzliche Schicht zusätzlich zu seiner geringen Proto-Implementierung. Auf diese Weise erhalten Sie es viele Vorteile der Arbeit mit DataStoreaber mit a SharedPreferences
-als Mittel zur Strukturierung von Daten verwenden Schlüssel/Wert-Paare.
Wenn wir uns die Preferences API ansehen PreferencesSerializer
und unser benutzerdefiniertes ProtoUserPreferencesSerializer
Sie werden feststellen, dass sie meistens dasselbe tun. PreferencesSerializer
es hat nur einen zusätzlichen Transformationsschritt Schlüssel/Wert-Paare in Protobuffs und umgekehrt:
Implementierung von DataStore mit Kotlin-Serialisierung
Wenn Sie verwenden möchten Kotlin-Serialisierung Um Ihre Daten zu strukturieren, müssen Sie lediglich a definieren eine vollständig unveränderliche Datenklasse und einen DataStore implementieren Serializer
.
DataStore verlässt sich auf equals
ich hashCode
die für Datenklassen automatisch generiert werden. Es werden auch Datenklassen generiert toString
ich copy
Funktionen, die zum Debuggen und Aktualisieren von Daten nützlich sind:
🚨 Das ist sehr wichtig Stellen Sie sicher, dass Ihre Klasse unveränderlich ist seit DataStore ist nicht mit Variablentypen kompatibel. Die Verwendung von Variablentypen mit dem DataStore führt dazu Fehler aufgrund inkonsistenter Daten und Rennbedingungen. Datenklassen Sie sind nicht unbedingt standardmäßig unveränderlichStellen Sie also sicher, dass Sie überall wave anstelle von vars verwenden:
Arrays sind variabel, also sollten sie nicht ausgesetzt werden. Auch wenn wir es nur zum Lesen verwenden List
als Mitglied unserer Datenklasse ist es immer noch variabel. Stattdessen sollten Sie erwägen, es zu verwenden unveränderliche / dauerhafte Sammlungen:
Die Verwendung von Variablentypen als Mitglied Ihrer Datenklasse macht sie änderbar. Stattdessen sollten Sie dafür sorgen alles Mitglieder sind unveränderliche Typen.
Kotlin unterstützt die Serialisierung mehrere Formateeinschließlich JSON und Protokollpuffer. In diesem Beispiel fahren wir mit JSON fort.
Um Ihre Datenklasse in JSON mithilfe der Kotlin-Serialisierung zu lesen und zu schreiben, müssen Sie Ihre Datenklasse mit markieren @Serializable
und überwältigen Serializer’s
writeTo()
ich readFrom()
. Hier ein Beispiel mit UserPreferences
:
⚠️ Grundstücke sind nicht sicher mit DataStore verwenden, da sich das Datenformat zwischen Android-Versionen ändern kann.
Gehen Sie die neu erstellten durch UserPreferencesSerializer
im DataStore, wenn Sie es erstellen:
Das Auslesen der Daten sieht genauso aus wie bei Protobuffs:
Sie können die generierte verwenden .copy()
Datenaktualisierungsfunktion:
Verwenden von DataStore mit Kotlin-Serialisierung und Datenklassen kann den Standard senken und Ihren Code vereinfachenSie müssen jedoch darauf achten, es nicht einzuführen Fehler durch Variabilität. Sie müssen lediglich Ihre Datenklasse definieren und einen Serializer implementieren.
Wir deckten ab Kotlin-Serialisierung und die notwendigen Schritte zur Verwendung Persistente DataStore-Daten strukturieren – Verwenden von vollständig unveränderlichen Datenklassen und Schreiben in JSON mit@Serializable
Beachten Sie, überwältigend unsere Serializer’s
writeTo()
ich readFrom()
und schließlich die Weiterleitung an unsere DataStore-Instanz.
Begleiten Sie uns für den nächsten Beitrag in unserer Serie, in dem wir untersuchen, wie es geht Synchronbetrieb mit DataStore.