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

我正在使用

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

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

编辑:(指定我的目标,不仅是问题)

我的目标是将DefaultHttpClient与持久性cookie一起使用。

有经验的人可以带领我走上正轨吗? 可能还有另一种我没有发现的最佳实践……

创建自己的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库支持SharedPreferences的自动持久cookie存储:

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

或者,如果您仍想使用DefaultHttpClient,则可以提取并使用PersistentCookieStore.java和SerializableCookie.java类。