11

v2GooglePlayサービスのGoogleのLatLngクラスを使用しています。その特定のクラスはfinalであり、を実装していませんjava.io.SerializableLatLngそのクラスを実装させる方法はありますSerializableか?

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

    // ...
}

mLocation 一時的なものを宣言したくありません。

4

2 に答える 2

30

そうではありませんSerializableが、それがParcelableオプションになる場合はそうです。そうでない場合は、シリアル化を自分で処理できます。

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());
    }
}
于 2013-01-08T17:29:09.120 に答える
2

をご覧いただけますObjectOutputStream

まず、オブジェクトのドロップイン置換を作成する必要があります:

    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(...);
    }

}

次に、適切な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);
    }

}

次に、シリアル化するときにこれらのストリームを使用する必要があります

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();
}
于 2013-01-08T17:35:36.193 に答える