Serialisierbare Unterklasse einer nicht-serialisierbaren übergeordneten Klasse
Ich bin der Kollision mit einem brickwall mit Serialisierung einer Unterklasse der Lage in android/java
Lage ist nicht serialisierbar.
Ich habe eine erste Unterklasse aufgerufen FALocation, dass keine Instanz-Variablen. Ich habe erklärt es serialisierbar.
Dann habe ich eine zweite Klasse namens " Wegpunkt, der wie folgt aussieht:
public class Waypoint extends FALocation implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/* Class variables *******************************************************/
private static int CLASS_VERSION=1; //Used to version parcels
/* Instance variables ****************************************************/
private transient String type=DataHelper.PT_TYPE_US;
private transient String country;
private transient String name=null;
private transient String description=null;
private transient int elevation = 0;
private transient int population = 0; //Afterthought, added to match the DB structure
/* Constructors **********************************************************/
public Waypoint() {
super();
}
public Waypoint(double lat, double lon, String name, String description) {
super(lat, lon);
this.setName(name);
this.setDescription(description);
}
public Waypoint(Location l) {
super(l);
}
public Waypoint(String provider) {
super(provider);
}
/* Implementing serializable */
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
Log.v("DroidFA", "Serialising \"%s\" (v%d).", Waypoint.class.getSimpleName(), CLASS_VERSION);
out.writeInt(CLASS_VERSION);
out.writeObject(type);
out.writeObject(country);
out.writeObject(name);
out.writeObject(description);
out.writeInt(elevation);
out.writeInt(population);
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
int serialClassVersion = in.readInt();
Log.v("DroidFA", "Deserialising \"%s\" (v%d).", Waypoint.class.getSimpleName(),serialClassVersion);
type = (String) in.readObject();
country = (String) in.readObject();
name = (String) in.readObject();
description = (String) in.readObject();
elevation = in.readInt();
population = in.readInt();
}
}
Serialisierung funktioniert einwandfrei.
Deseriamization produziert die followwing Ausnahme (die Bein-Objekt enthält einen Wegpunkt).:
10-05 13:50:35.259: WARN/System.err(7867): java.io.InvalidClassException: android.location.Location; IllegalAccessException
10-05 13:50:35.267: WARN/System.err(7867): at java.io.ObjectInputStream.resolveConstructorClass(ObjectInputStream.java:2010)
10-05 13:50:35.267: WARN/System.err(7867): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2095)
10-05 13:50:35.267: WARN/System.err(7867): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
10-05 13:50:35.267: WARN/System.err(7867): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
10-05 13:50:35.278: WARN/System.err(7867): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
10-05 13:50:35.278: WARN/System.err(7867): at com.droidfa.navigation.Leg.readObject(Leg.java:262)
.../...
- Es scheint, das problem ist irgendwo anders. com.droidfa.navigation.Bein.readObject(Leg.java:262)
- Leg Zeile 262 ist : "aus = (Wegpunkt) an.readObject();" das ist, wo das problem liegt in der Tat ;).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es absolut notwendig, zu serialisieren der Lage? vielleicht könnten Sie markieren es als vorübergehend, und erhalten es dynamisch nach dem Deserialisieren das Objekt. (Trotzdem, aus der Dokumentation ) :
So, wenn die Unterklasse hat Zugriff auf die Felder der nicht-serialisierbaren Superklasse(N) es kann, verwenden Sie die writeObject-und readObject-Protokoll zu implementieren-Serialisierung. Ansonsten gibt es Felder, die nicht möglich sein, zu serialisieren.
Aussieht Lage nicht über public/protected no-arg-Konstruktor. So wird ein Konstruktor benötigt für die Herstellung zur Verfügung, für die Serialisierung in der Unterklasse.
http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html sagt:
Und gleichzeitig mit den Worten von Serialisierung Spezifikation:
Das würde erklären, warum Sie die Probleme haben, nur in Deserialisierung, denn natürlich Konstruktor wird nicht aufgerufen, die während der Serialisierung.
Kleines Beispiel für das Versäumnis ohne zugänglich Konstruktor: