如何在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类。