如何在Android中使用DefaultHttpClient创建持久化Cookie?

3

我正在使用

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

现在,由于Cookie没有实现可序列化接口,我无法序列化该List。

编辑:(明确了我的目标,不仅是问题)

我的目标是使用DefaultHttpClient和持久性Cookie。

有经验的人能否指导我正确的方向?可能还有其他最佳实践我还未发现...

2个回答

6
创建自己的SerializableCookie类,它实现了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 类已经实现了 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中使用那个类。

谢谢,我觉得这个方法可能行得通,但我希望有更简单的方法来达到我的目标。我希望SDK中有一些现成的功能,这样我就不用再发明轮子了,但既然是Java,我可能必须这样做。我认为使用持久性Cookie是典型问题。抱歉,我第一次提问可能有点不清楚,但我已经更新了它。无论如何,感谢您的建议。 - Vidar Vestnes
不序列化真正的 cookie 是有道理的,因为它们代表了一个状态,这个状态在反序列化时可能是无效的。只需将它们保留在内存中或仅将名称/值对存储在 Map 中,并代之以序列化。 - BalusC

2
安卓异步Http库支持自动将cookie存储到SharedPreferences中: http://loopj.com/android-async-http/ 如果您仍想使用DefaultHttpClient,也可以提取并使用PersistentCookieStore.java和SerializableCookie.java类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接