Re: [問題] Intent傳遞複雜參數
※ 引述《mysteriousGE ( )》之銘言:
: 該如何使用Intent傳遞複雜的參數?
: Google了一下
: 不外乎是讓要傳遞的物件類別 implements Serializable 或 Parcelable
: 我測試了一下,當要傳遞的物件類別「夠簡單」才可以這樣實做
: 例如 該類別中僅僅包含有 String boolean int....型態的變數
: 我想要傳遞的物件類別中 包含有很多我自己定義的class 物件
: 若 implements Serializable 會發生Runtime error 無法傳遞
: 若 implements Parcelable writeToParcel的 Function 會相當複雜
: 不知該如何實做.....
: 請問還有其他解法嗎? Orz
: 感謝!
目前來講應該是很少Serializable不能傳的
只是麻煩而以...er...不對,Serializable應該是最簡單的才對
一個東西要能Serializable要滿足兩個條件
1. 自己本身要implements Serializable並且產生UID
(請務必在Compile time自己做,不自己做的話每個版本的JVM都會幫你算出不同的ID
然後你拿OSX編出來的jar到win下用就炸了)
2. 自己旗下所有的field都要能Serializable,不想被Serialize的一定要
加上transient關鍵字
其實大概就這兩點.
1的話其實不用多講,大家都是被Eclipse寵壞的小孩,所以Eclipse提醒以及幫你搞定
請選擇generate ID而非用一個-1L當作default ID
2的話可能複雜點,要分幾個層面來講。
第一個層面就是大多數我們習慣使用的非指定實作界面(簡單來講,比方說List<>)
多半都沒辦法用在Field上了,我們沒有辦法在implements才決定要使用哪種List
(List可不是只有ArrayList,有LinkedArrayList, 還有極重要的CopyOnWriteArrayList)
我們必須要field宣告的時候就得宣告「serializable的list」(上面幾種都有)
而沒辦法空泛地寫List<String> theField;(List是non-serializable)
所以這種寫法將沒辦法再繼續使用
List<String> theField;
A() {
theField = ArrayList<String>();
}
這應該是Serializable最大的問題....反正,碰到就查docs.oracle.com/java
看他有沒有implement Serializable即可
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
比方說ArrayList,看All implemented interfaces : 恩有Seriablizable
所以他是可以當作serialize的
第二個層面則是延續第一個層面,他所有field都要Serializable,包含custom class
那custom class之所以要serializable,代表它旗下的所有field也要serializable
所以你必須一層層的implements Serializable並且做第一層面的事情
這個改動會頗大...不過反正runtime exception會告訴你哪裡還沒搞定
Serializable應該是最方便的東西之一,但是會造成整個結構很死,尤其是繼承其他
界面實作出來的class。它妙用可不止在intent之間傳遞,它可以非常簡單的直接寫成
檔案甚至被當成stream經由socket網路傳送出去(對方當然要知道怎麼解譯)。因為它
實在太好用了,所以常常會有被濫用的情況發生...
比方serializable class說寫入檔案
(某Serializable class的instance叫做item)
ObjectOutputStream obj_out = new ObjectOutputStream(new FileOutputStream(
new File(MY_DESTINATION_FILE)));
obj_out.writeObject(item);
obj_out.flush();
obj_out.close();
你沒看錯,四行搞定(折行算一行)
比方說從檔案讀入class
ObjectInputStream obj_in = new ObjectInputStream(new FileInputStream(
new File(MY_TARGET_FILE)));
ret = obj_in.readObject();
obj_in.close();
恩,三行搞定,注意ret是object,要自己強制轉型成自己要的class
既然都有Object Stream了,那把它丟進socket也不過分吧?這個自己try了
不過我個人是不太喜歡Serializable啦,他有一定程度上的型別以及其它問題
(有人願意開個串說明一下Serializable的問題嗎? XD)
但是對大多數人來講,這是一個相當有吸引力的選擇。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.41.125.80
→
08/18 13:27, , 1F
08/18 13:27, 1F
→
08/18 13:27, , 2F
08/18 13:27, 2F
討論串 (同標題文章)