作者Killercat (杀人猫™)
看板AndroidDev
标题Re: [问题] Intent传递复杂参数
时间Sat Aug 18 13:23:04 2012
※ 引述《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
2F:→ Killercat:有效期限只有一个月 请自行取用 08/18 13:27