Verwenden von Parcelable mit Zirkelverweisen

8

Parcelable scheint keine zirkulären Referenzen wie Serializable zu verarbeiten. Im folgenden Beispiel funktioniert die Serialisierung von Balken einwandfrei, aber das Schreiben in ein Paket verursacht einen Stackoverflow:

%Vor%

Ich versuche, etwas Code von der Verwendung von Serializable zu Parcelable zu portieren, die zirkuläre Referenzen verwendet. Gibt es eine gute Strategie für den Umgang mit Parcelable?

    
emmby 11.11.2009, 02:10
quelle

2 Antworten

1

Vielleicht liegt die Antwort in einem intelligenteren Set von writeToParcel- und createFromParcel-Methoden?

Ganz oben in meinem Kopf könnten Sie eine Liste von Objekten aufbewahren, die Sie bereits vollständig in ein bestimmtes Paket geschrieben haben, und sie nur anhand eines Tags identifizieren (ihre lokale identityHashCode (), vielleicht). (Beachten Sie, dass dies keine globale Liste ist, sondern explizit per Paket; vielleicht selbst über eine halb-globale Map<Parcel,Set<Integer> > gespeichert? Sie müssten sicher sein, dass das Set vergessen wurde, sobald das Paket vollständig geschrieben wurde.)

Das relevante Bit von writeToParcel() würde ungefähr so ​​aussehen:

%Vor%

Die entsprechende createFromParcel() wäre etwas komplexer.

Ich erwarte, dass es bei dieser Methode lauernde Probleme gibt, aber dort würde ich anfangen. Wie ich es hier gesagt habe, hängt es davon ab, dass identityHashCode() für verschiedene Objekte garantiert unterschiedlich ist - es ist normalerweise auf 32-Bit-JVMs (wobei es der Wert des zugrundeliegenden C ++ - Zeigers ist). Plain hashCode() könnte sich lohnen (vielleicht mit dem Zusatz von Tippinformationen?), Oder vielleicht eine Art von Seriennummer.

Eine andere Möglichkeit wäre, einfach Ihre Objekte zu einem byte[] zu serialisieren und in Parcel zu schreiben, aber das erscheint mir ein bisschen ineffizient ...

    
crazyscot 12.01.2011 17:20
quelle
0

Verwenden Sie die Java-Serialisierung. Lassen Sie Ihre Klasse Externalizable anstelle von Parcelable erweitern und konvertieren Sie sie mit ObjectOutputStream in ein Byte-Array. Übergeben Sie dieses Byte-Array an die andere Seite [1] [2] und es mit ObjectInputStream deserialisieren.

Android Parcelables sind sehr schnell, aber diese Geschwindigkeit kommt zu Lasten aller zusätzlichen Funktionalität, die traditionell in Serialisierungs-Frameworks vorhanden ist.

Java-Serialisierung wurde entwickelt, um leistungsfähig und flexibel zu sein und unterstützt viele Dinge einschließlich der Handhabung von Zirkelverweisen. Wenn Sie das benutzerdefinierte serialVersionUID deklarieren (um zu vermeiden, dass es zur Laufzeit reflektive Berechnungen durchführt) und Klasseninhalte manuell in readExternal / writeExternal lesen, erhalten Sie fast die gleiche Leistung wie bei Parcelable (wo "fast" für das Verfolgen von Zirkelreferenzen aufgewendet wird) und so).

    
user1643723 16.12.2016 08:00
quelle

Tags und Links