作者tkcn (小安)
看板java
標題Re: [問題] ObjectOutputStream + ImageIO 出現的問題
時間Thu Dec 31 11:16:48 2009
: ◆ From: 220.132.160.117
: ※ 編輯: tkcn 來自: 220.132.160.117 (12/30 22:21)
: → tkcn:code 更新了,剛剛建立 Stream 的順序錯誤,會導致 deadlock 12/30 22:22
: 推 ogamenewbie:ImageIO.read(in)改成(BufferedImage)in.readObject() 12/31 08:32
: → ogamenewbie:試試看? 12/31 08:33
: → tkcn:BufferedImage 應該不能 Serialize 吧? 12/31 08:48
: 推 ogamenewbie:我試試看弄個 class imp ser 存ImageIO write的byte[] 12/31 09:58
: 推 ogamenewbie:http://paste.plurk.com/show/121974/ 試試看? 12/31 10:37
: → ogamenewbie:先說好, 所有意外狀況全部都沒有預防... 12/31 10:38
: → tkcn:這支可以 work, 感謝。 不過還是很好奇為什麼原本的會有問題 12/31 10:46
看了一下 ImageIO.write(OutputStream) 的 source,
這方法會自動產生 ImageOutputStream,
所以真正送出去的 Stream 就變成:
ImageOutputStream -> ObjectOutputStream -> SocketOutputStream
我猜測可能是因為 ImageOutputStream 和 ObjectOutputStream 都有自己的 header,
當第二次在 ObjectOutputStream 上建立 ImageOutputStream 時,
就會寫入那多餘的 16-byte。
這樣也可以說明為什麼不用 ObjectOutputStream 就不會有問題。
---
我剛剛在測試的時候也有試過利用 ByteArrayOutputStream,
不過沒有額外包成一個 class,結果還是失敗。
也有試過直接把 png file 的 data 丟進 ObjectOutputStream,
( png file 當初也是用 ImageIO.write() 寫入的,並且我也在接收方檢查過 header )
結果接收方還是沒辦法用 ImageIO.read() 接下來。
( javax.imageio.IIOException: Unknown row filter type )
可能要晚點再繼續做測試了。 (用跨年夜測 = =)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.183.199
※ 編輯: tkcn 來自: 140.122.183.199 (12/31 11:20)
推 ogamenewbie:Object 的是有 header 12/31 12:00
推 sbrhsieh:tkcn 目前的做法即使不使用 ObjectIOStream 直接使用 12/31 16:42
→ sbrhsieh:SocketStream 應該也是會有不正確作動吧。 12/31 16:50
→ tkcn:剛剛測試過了,如 sbrhsieh 所說,確實有問題 12/31 17:06
推 Maisky:BufferedImage不是Serializable,傳不對不奇怪啊 01/01 08:36
→ tkcn:呃,是用 ImageIO 送的,跟 Serializable 無關 01/01 11:19
推 Maisky:就是因為不是serializable所以不保證送的對啊 01/01 22:02