Как сделать постоянным Cookies с DefaultHttpClient в Android?

Im, использующий

// this is a DefaultHttpClient
List<Cookie> cookies = this.getCookieStore().getCookies();

Теперь, поскольку Cookie не реализует сериализуемое, я не могу сериализовать этот список.

EDIT: (указана моя цель, а не только проблема)

Моя цель - использовать DefaultHttpClient с постоянными куками.

Любой, у кого есть опыт, который может привести меня на правильный путь здесь? Возможно, еще одна лучшая практика, которую я не обнаружил...

Ответ 1

Создайте свой собственный класс 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.

Ответ 2

Асинхронная Http-библиотека Android поддерживает автоматическое постоянное хранилище файлов cookie для SharedPreferences:

http://loopj.com/android-async-http/

В качестве альтернативы вы можете просто извлечь и использовать классы PersistentCookieStore.java и SerializableCookie.java, если вы все еще хотите использовать DefaultHttpClient.