2013-11-21 4 views
5

Я пытаюсь сериализовать свой класс местоположения (используя класс android.location)как сериализовать класс android.location?

но, это дает мне ошибку!

11-21 21:25:37.337: W/System.err(3152): java.io.NotSerializableException: android.location 

Итак, я попытался расширить класс android.location.Location.

private class NewLocation extends Location implements Serializable { 
     private String Provider; 
     private double Latitude, Longitude, Altitude; 

private float bear; 
     public NewLocation(Location l) { 
      super(l); 
      Provider = l.getProvider(); 
      Latitude = l.getLatitude(); 
      Longitude = l.getLongitude(); 
      Altitude = l.getAltitude(); 
      bear = l.getBearing(); 
     } 
    } 

После этого я попытался выполнить сериализацию расширенного класса, но с той же ошибкой.

Вот код сериализации

public static byte[] serialize(Object obj) throws IOException { 
     ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
     ObjectOutput oos = new ObjectOutputStream(bao); 
     byte[] data = null; 
     oos.writeObject(obj); 
     oos.flush(); 
     oos.close(); 
     data = bao.toByteArray(); 
     return data; 
    } 

почему эта ошибка?

+0

Чтобы сериализовать класс, вам необходимо убедиться, что все другие классы также являются Serializable, на которые ссылается NewLocation. – saiful103a

ответ

11

Категория: Android Location класс: инвентарьParcelable. Таким образом, вам лучше с ним, а не выполнять собственную сериализацию.

Просто используйте следующее, чтобы получить bytes из Location:

Parcel p = Parcel.obtain(); 
objLocation.writeToParcel(p, 0); 
final byte[] b = p.marshall();  //now you've got bytes 
p.recycle(); 

Однако, вы не должны сохранить байты (в постоянной памяти) из Parecelable объекта для дальнейшего использования, так как он предназначен для высокопроизводительных IPC транспорта и не является механизмом сериализации общего назначения.

+0

благодарю вас за консультацию! это сработало для меня. – user3017494

+0

как читать обратно на объект? –

+0

@ArthurMelo вам необходимо использовать метод ** unmarshall ** для обратного процесса. [например] (http://stackoverflow.com/a/18000094/966550) – waqaslam

2

Вы не можете сериализуемый класс, не связанный с сериализацией, только реализующий интерфейс Serializable. Сериализуемый класс должен наследовать от сериализуемого класса (если унаследованный класс) и иметь все его атрибуты, сериализуемые сами.

Все подтипы сериализуемого класса являются сериализуемыми. http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Однако, если вы хотите сериализовать Parcelable класс еще можно, но, конечно, это не будет хорошей практикой.

Смежные вопросы