2013-01-08 6 views
10

Ich verwende Google's LatLng class von den Google Play-Diensten der Version 2. Diese bestimmte Klasse ist endgültig und implementiert java.io.Serializable nicht. Gibt es eine Möglichkeit, dass LatLng Klasse Serializable implementieren?Wie serialisiert man eine nicht serialisierbare finale Klasse eines Drittanbieters (z. B. googles LatLng-Klasse)?

public class MyDummyClass implements java.io.Serializable { 
    private com.google.android.gms.maps.model.LatLng mLocation; 

    // ... 
} 

Ich will nicht mLocationtransiente erklären.

+0

suchen Sie nach einer Problemumgehung – UDPLover

Antwort

25

Es ist nicht Serializable aber es ist Parcelable, wenn das stattdessen eine Option wäre. Wenn nicht können Sie die Serialisierung selbst behandeln:

public class MyDummyClass implements java.io.Serialiazable { 
    // mark it transient so defaultReadObject()/defaultWriteObject() ignore it 
    private transient com.google.android.gms.maps.model.LatLng mLocation; 

    // ... 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     out.defaultWriteObject(); 
     out.writeDouble(mLocation.latitude); 
     out.writeDouble(mLocation.longitude); 
    } 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
     in.defaultReadObject(); 
     mLocation = new LatLng(in.readDouble(), in.readDouble()); 
    } 
} 
+0

Danke für Ihre Antwort; es hat für mich funktioniert. –

2

Sie einen Blick auf ObjectOutputStream haben.

Zunächst werden Sie ein Drop-in-Ersatz für Ihr Objekt erstellen müssen:

public class SerializableLatLng implements Serializable { 

    //use whatever you need from LatLng 

    public SerializableLatLng(LatLng latLng) { 
     //construct your object from base class 
    } 

    //this is where the translation happens 
    private Object readResolve() throws ObjectStreamException { 
     return new LatLng(...); 
    } 

} 

dann eine entsprechende erstellen ObjectOutputSTream

public class SerializableLatLngOutputStream extends ObjectOutputStream { 

    public SerializableLatLngOutputStream(OutputStream out) throws IOException { 
     super(out); 
     enableReplaceObject(true); 
    } 

    protected SerializableLatLngOutputStream() throws IOException, SecurityException { 
     super(); 
     enableReplaceObject(true); 
    } 

    @Override 
    protected Object replaceObject(Object obj) throws IOException { 
     if (obj instanceof LatLng) { 
      return new SerializableLatLng((LatLng) obj); 
     } else return super.replaceObject(obj); 
    } 

} 

Dann werden Sie diese Streams verwenden müssen, wenn Serialisierung

private static byte[] serialize(Object o) throws Exception { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new SerializableLatLngOutputStream(baos); 
    oos.writeObject(o); 
    oos.flush(); 
    oos.close(); 
    return baos.toByteArray(); 
} 
Verwandte Themen