Как сделать постоянные файлы cookie с помощью DefaultHttpClient в Android?
Я использую
// this is a DefaultHttpClient
List<Cookie> cookies = this.getCookieStore().getCookies();
Теперь, так как Cookie не реализует сериализуемый, я не могу сериализовать этот список.
РЕДАКТИРОВАТЬ: (указана моя цель, а не только проблема)
Моя цель - использовать DefaultHttpClient с постоянными файлами cookie.
Кто-нибудь с опытом, который может привести меня на правильный путь здесь? Может быть еще одна лучшая практика, которую я не обнаружил...
2 ответа
Создайте свой собственный SerializableCookie
класс который implements Serializable
и просто скопируйте Cookie
свойства при его строительстве. Что-то вроде этого:
public class SerializableCookie implements Serializable {
private String name;
private String path;
private String domain;
// ...
public SerializableCookie(Cookie cookie) {
this.name = cookie.getName();
this.path = cookie.getPath();
this.domain = cookie.getDomain();
// ...
}
public String getName() {
return name;
}
// ...
}
Убедитесь, что все свойства также являются сериализуемыми. Помимо примитивов, String
класс например сам по себе уже implements Serializable
так что вам не нужно беспокоиться об этом.
Кроме того, вы также можете обернуть / украсить Cookie
как transient
свойство (чтобы он не сериализовался) и переопределить writeObject()
а также readObject()
методы соответственно. Что-то вроде:
public class SerializableCookie implements Serializable {
private transient Cookie cookie;
public SerializableCookie(Cookie cookie) {
this.cookie = cookie;
}
public Cookie getCookie() {
return cookie;
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeObject(cookie.getName());
oos.writeObject(cookie.getPath());
oos.writeObject(cookie.getDomain());
// ...
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
cookie = new Cookie();
cookie.setName((String) ois.readObject());
cookie.setPath((String) ois.readObject());
cookie.setDomain((String) ois.readObject());
// ...
}
}
Наконец, используйте этот класс вместо List
,
Android-асинхронная библиотека Http поддерживает автоматическое постоянное сохранение файлов cookie для SharedPreferences:
http://loopj.com/android-async-http/
В качестве альтернативы вы можете просто извлечь и использовать классы PersistentCookieStore.java и SerializableCookie.java, если вы все еще хотите использовать DefaultHttpClient.