深度克隆:ObjectInputStream、ObjectOutputStream和ByteArrayOutputStream
来源:互联网 发布:油罐容积计算软件 编辑:程序博客网 时间:2024/05/16 17:59
下面一段深度克隆的源码,不甚理解,查查记录下来
bout = new ByteArrayOutputStream(); //定义一个字节数组输出流 ObjectOutputStream oos = null; //对象输出流 ObjectInputStream ois = null; oos = new ObjectOutputStream(bout); oos.writeObject(oldValue); //将指定的对象写入字节数组输出,进行序列化 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ois = new ObjectInputStream(bin); //执行反序列化,从流中读取对象 newValue = (Serializable) ois.readObject();ByteArrayOutputStream类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据,它的大小是该输出流中已存入的有效数据的当前大小。例如:
int a = 0,b = 1,c = 2; ByteArrayOutputStream bout = new ByteArrayOutputStream(); bout.write(a); bout.write(b); bout.write(c); byte[] buff = bout.toByteArray(); for (int i = 0; i < buff.length; i++) System.out.println(buff[i]);输出的结果为:0、1、2。
java这种面向对象的语言在编程的时候数据大都存储在对象中,有时需要将内存中的所有对象写到文件中去,然后在适当的时候将文件中的对象还原至内存中,上边代码中出现的ObjectInputStream与ObjectOutputStream这两个类就可以完成这个任务。
序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。需要序列化的对象必须实现Serializable接口。Serializable接口没有任何的抽象方法,实现这个接口仅仅是为了通知编译器这个对象将要被序列化而已。对象中的transient和static类型成员变量不会被读取和写入。ObjectInputStream 将原数据和使用 ObjectOutputStream之前写入的 对象反序列化,ObjectInputStream 用来恢复之前序列化的对象。
上述代码通过ByteArrayOutputStream获取内存中的缓存数据并转成数组;而ByteArrayInputStream 将字节数组转化为输入流。
实际的数据流向:ObjectOutputStream->ByteArrayOutputStream->ByteArrayInputStream ->ObjectInputStream,深度复制从序列化对象又转为序列化对象
0 0
- 深度克隆:ObjectInputStream、ObjectOutputStream和ByteArrayOutputStream
- ObjectInputStream和ObjectOutputStream
- ObjectInputStream和ObjectOutputStream
- ObjectOutputStream和ObjectInputStream
- ObjectInputStream和ObjectOutputStream
- ObjectOutputStream和ObjectInputStream
- Java ObjectInputStream 和 ObjectOutputStream
- ObjectOutputStream和ObjectInputStream
- ObjectInputStream和ObjectOutputStream类
- 使用对象输入输出流(ObjectOutputStream,ObjectInputStream)实现序列化对象的深度克隆
- 有关ObjectInputStream和ObjectOutputStream性能
- ObjectOutputStream 和 ObjectInputStream的使用
- Java IO ObjectInputStream和ObjectOutputStream
- 对象流(ObjectOutputStream 和 ObjectInputStream)
- ObjectInputStream ObjectOutputStream
- ObjectInputStream ObjectOutputStream
- ObjectOutputStream/ObjectInputStream
- ObjectInputStream & ObjectOutputStream
- JAVA连接ACCESS(不使用数据源)
- 2014北京邀请赛B Beautiful Garden
- JavaScript日期格式化
- JavaScript绘图 (DIV箭头)
- Linux下如何解压tar.bz2文件
- 深度克隆:ObjectInputStream、ObjectOutputStream和ByteArrayOutputStream
- OO经典说明图
- JS对象序列化为JSON对象
- Eclipse 任务标记
- JS移动的方块
- JS 地图移动拖拽
- 常见的HTTP 状态代码
- CSS样式查询 border-style
- CSS样式 cursor