Как сделать постоянные файлы 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.

Другие вопросы по тегам