作者LaPass (LaPass)
看板java
标题Re: [问题] Tomcat杂问
时间Sun May 6 13:16:28 2012
1F:→ LaPass:现在我看到Serializable就头大.... 这东西不好用....orz 05/05 15:15
2F:→ LaPass:4板... 有点久不过我先去找来看看 05/05 15:27
3F:推 PsMonkey:敢问 Serializable 哪里不好用? 05/06 01:04
看到libary中有 Serializable 这个东西
通常就是准备一个物件存成档案、透过网路线传到别的地方去之类的
大部分的状况下,用起来还不错
但是我在传的时候常常遇到一种问题
Class T implement Serializable
{
public int i;
public T(int i){this.i =i;}
}
T t1 = new T(1);
T t2 = new T(2);
T t3 = new T(3);
ArrayList<T> alt = new ArrayList();
alt.add(t1);
alt.add(t2);
// 把 alt透过ObjectStream传去出
// 这时很正常,对方收到的alt里面的T.i分别是 1、2
t1.i = 4;
t2.i = 5;
t3.i = 6;
alt.add(t3);
// 第二次把 alt透过ObjectStream传去出
// 这时就会出问题了,alt里面的T.i是 1 2 6
类似的状况也发生在android中的
Bundle b = getIntent().getExtras();
b.putSerializable();
b.getSerializable();
这是跨activity传递值的办法
第一次使用Bundle传递Serializable物件时,ok
第二次使用时,就会出问题,收到的值可能会跟传过去的不一样。
要说原理
虽然我没看到解释这种状况的文
但是我猜Serializable在传递Object时,会先检查参照
如果有跟曾经传过的物件的参照一样,就直接使用上一次传过去的值
所以,在用Serializable的时候,不小心的话会出现难以发现的bug
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.233.155.148
4F:→ qrtt1:呼叫个 reset() 很困难吗@@? 05/06 15:07
5F:→ LaPass:bundle下找不到reset.... 05/06 15:39
6F:→ LaPass:tomcat的session...不清楚 05/06 15:54
8F:→ qrtt1:Android 用 Bundle 送我倒没试过。等有实战经验再回来分享 05/06 17:13
9F:→ LaPass:是啊,第一次遇到这个问题就是PO qrtt1贴的篇文的时候,第 05/06 18:25
10F:→ LaPass:二次是用android的bundle的时候。第二次的解决方式是,用 05/06 18:32
11F:→ LaPass:基本型值,例如int String 之类的去传 05/06 18:34
12F:推 cuteclare:Bundle 应该有putByteArray getByteArray 05/06 22:09
13F:→ cuteclare:这样应该也可以用 Serializable ba? 05/06 22:10
14F:→ LaPass:已经有put/set Serializable可以用了,但是第二次值会跑掉 05/06 23:16
15F:推 cuteclare:...我的意思是说自己做byte[]->obj的动作 05/07 07:09
16F:→ LaPass:囧" 听起来很麻烦的样子.... 但应该可行 05/07 09:15