2010-05-18 49 views
3

即時通訊使用如何在Android中使用DefaultHttpClient創建持久Cookie?

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

現在,因爲Cookie不實現可序列化,我不能序列化列表。

編輯:(指定我的目標,不僅是問題)

我的目標是使用具有持久cookie的DefaultHttpClient。

任何有經驗的人都可能帶我走上正確的軌道嗎?可能還有另一個我沒有發現的最佳做法...

回答

6

創建屬於自己的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,所以您不必擔心這一點。

另外,您也可以包裝/裝飾Cookietransient性質(所以它不會序列化)並覆蓋writeObject()readObject()方法accordingly。例如:

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中使用該類。

+0

謝謝,我認爲這可能有效,但我希望有更簡單的方法來實現我的目標。我希望在SDK中會有一些現成的功能,所以我不必再次發明輪子,但是自從Java開始,我可能不得不這樣做。使用永久性Cookie是我認爲的典型問題。對不起,我的問題首先不太清楚,但我已經更新了它。無論如何,林謝謝你的建議。 – 2010-05-18 17:25:12

+0

不要序列化真正的cookie是有意義的,因爲它們表示的是在您反序列化它時可能無效的狀態。只需將它們保存在內存中,或者只將名稱/值對存儲在「Map」中,然後對其進行序列化。 – BalusC 2010-05-18 17:28:46

+0

非常感謝您的回答! – 2010-05-24 09:00:46

2

Android的異步HTTP庫支持自動持久cookie存儲到SharedPreferences:

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

或者你可以只提取和使用PersistentCookieStore.java和SerializableCookie.java類,如果你仍然想使用DefaultHttpClient。