作者tkcn (小安)
站内java
标题Re: [问题] ObjectOutputStream + ImageIO 出现的问题
时间Sat Jan 2 10:20:46 2010
※ 引述《Maisky (McDummy)》之铭言:
: 如果要用ObjectInputStream和ObjectOutputStream, 传的object就应该要
: 是Serializable. 而BufferedImage不是Serializable,所以
: ImageIO.write(BufferedImage, "png", ObjectOutputStream)
并没有说用 ObjectOutputStream 传的 object 就必须 Serializable。
正确的说法应该是,
透过 writeObject() 传出去的 object 才需要 Serializable。
ObjectOutputStream 用的是 Composition 的概念,
在他的内部其实是另一个 OutputStream,
当呼叫的 method 与 Object 的操作无关,
ObjectOutputStream 就会直接把呼叫转给其内部的 OutputStream。
以 write(byte[]) 为例,source code 如下:
public void write(byte[] buf) throws IOException {
bout.write(buf, 0, buf.length, false);
}
// 其中 bout 就是 ObjectOutputStream 内部的 Stream
ImageIO 跟 ObjectOutputStream 的 source 都有点复杂,
所以接下来我就直接推理了。
如果你有看完这串所有的讨论,
你应该会知道後来我们已经发现这个问题跟 ObjectOutputStream 无关,
即使是用 FileOutputStream 或 SocketOutputStream 也会有相同的问题,
并且我们已经找出问题并解决了。
如果如你所说,ImageIO 是用 Serializable 方式传送图片,
你要如何解释为什麽使用 FileOutputStream 没有问题?
---
ImageIO 不是用 Serializable 在传资料的,
他是把 image,依照你所指定的 format (jpg, png, etc) 写成对应的 Image File,
所以用 ImageIO 把 image 写成档案後,你家的绘图软体才打得开。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.160.117
1F:→ TonyQ:Composition? 这不是 Decoration 吗 ?XD 01/02 10:32
2F:→ tkcn:Decorated 的精神之一就是用 Composition 代替 Inheritance 01/02 10:57
3F:→ TonyQ:你在开玩笑吧 , 你翻翻API就看的到 ObjectOutputStrema有 01/02 11:07
4F:→ TonyQ:继承 OutputStream , 且被装饰者本就跟装饰者要同一继承体系 01/02 11:09
5F:→ TonyQ:怎麽会有「代替」继承这回事出现 , 这两者在这的性质不同啊. 01/02 11:11
6F:→ TonyQ:还是你在讲得是子类别延伸出去的继承树 XD 01/02 11:16
7F:→ TonyQ: *避免 01/02 11:18
8F:→ tkcn:他还是有利用到继承没错,但那是为了达成 setComponent的手段 01/02 11:25
9F:→ TonyQ:如果是要 setComponent , interface-implement 就ok了 XD 01/02 11:29
10F:→ tkcn:但是 OutputStream 里头有提供实作,我觉得这样做并没有问题 01/02 11:31
11F:→ TonyQ:觉得应是OutputStream要拿来作为被装饰的基底类别吧:3 01/02 11:31
12F:→ TonyQ:觉得虽然Composition可以解释 , 不过总觉得很别扭 XD 01/02 11:32
13F:→ tkcn:ttp://tinyurl.com/yfh8269 最後一段 01/02 11:33
14F:→ TonyQ:是说讲Composition 我总会想到 Composition Pattern . XDDD 01/02 11:37
16F:→ Maisky:我说的是BufferedImage不是Serializable,所以才会有问题的 01/03 09:10
17F:→ Maisky:Only objects that support the java.io.Serializable 01/03 09:12
18F:→ Maisky:interface can be written to streams. 01/03 09:13
19F:→ Maisky:我并没说ImageIO 是用 Serializable 方式传送图片 01/03 09:21
20F:→ tkcn:ImageIO 是重新分析 Object 内容用对应 format byte 阵列传送 01/03 12:27
21F:→ tkcn:我不懂你现在到底想干嘛,证明你是对的? 01/03 12:29