对对象的序列化
-
序列化 :
sum s = new sum(); s.soul =526; s.sun=256; try { FileOutputStream ou = new FileOutputStream("yGame.ser"); ObjectOutputStream os = new ObjectOutputStream(ou); os.writeObject(s); os.close(); } catch (Exception e) { e.printStackTrace(); }
-
从文件中读出对象的值
try { FileInputStream om = new FileInputStream("yGame.ser"); ObjectInputStream input = new ObjectInputStream(om); Object[] ser = new Object[12]; int i=0; ser[i++] = input.readObject(); sum mm= new sum(); mm = (sum) ser[0]; input.close(); System.out.println(mm.sun); System.out.println(mm.soul); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
-
读出过程 :
1 . 对象从 Stream中读出来
2.Java JVM通过储存的信息判断对象的class类型
3.Java JVM 尝试寻找和加载对象的类,如果Java JVM找不到或无法加载时该类,则Java JVM
会抛出例外。
4.新的对象会被配置在堆上,但是构造函数不会执行!这样对象就成了新的状态,我们需要的是储存时候的状态 。
5.if 对象在继承树上有个不可序列化的祖先类,则该不可序列化樊以及在它之上的类的构造函数(就
算是可序列化也一样 会执行一旦构造函数披连锁启动之后将无法停止 也就是说。从第 个不可
序列化的父类开始.全部都会重新初始状态。
6.对象的实例变量会被还原成实例化时顶的状态值。transient变量会被复制null的对量。引用或primitive主,那数据类型的默认值为0,false等值。
-
静态变量不会被序列化
要点
- 你可以通过序列化来存储对象的状态。
- 使用ObjctOuputStean来序列化对象(java.io)。
- Surcam是连接申流或是链接用的串流。
- 连接串流用来表示源或目的地、文件、则络套接字连接。
- 链接用串流用来衔接连接串流。
- 用FilcOutpuSream链接ObjectouputStream来将对象序列化
到文件上。 - 调用ObjectoupuStrcam的writeobject(heobject)来将对象序列化,不需调用FileOutputStream的方法。
- 对象必须实现序列化这个接口才能被序列化。如果父类实现序列化,则子类也就自动地有实现,而不管是否有明确的声明。
- 当对象被序列化时,整个对象版图都会被序列化。这代表它的实例变量所引用的对象也会被序列化。
- 如果有不能序列化的对象,执行期间就会抛出异常。
- 除非该实例变量被标记为transient。否则,该变量在还原的时候会被赋子予null或primitive主数据类型的默认值。
- 在解序列化时(deserialization),所有的类都必须能让Java虚拟机找到。
- 读取对象的顺序必须与写人的顺序相同。
- readObject()的返回类型是Object,因此解序列化回来的对象还需要转换成原来的类型。
- 静态变量不会被序列化,因为所有对象都是共享同一份静态变量值。
-
1)序列化适用于存储散据输非J加a程序使用的情境。False
(3)OyeciOutputscam是个用来存健序列化对象的类。True
(4)磁接申流可以单独使用成与做接申流并用。False
(5)调用witcObjec()可能会存储好几个对象。True
(7)transicnt这个修饰符让你将实例变量标记为可序列化的。False
(8)如果父类是不可序列化的,则子类就不能设定成可序列化。False
(9)当对象被序列化时,它的读取顺序必须是相反的。False
(10)当对象还原时,构造函数不会执行。True
(11)序列化与使用文本文件保存的操作都可能会抛出异常。True
(12)BufferedWriter可以链接到FileWriter上。True
(13)File对象代表文件而不是目录。False
(15)文件的读写申流机制可以用到缓冲区机制。True
(16)String的splitO金将分隔字符解析成结果的一部分。False
(17)对类的任何修改都会破坏之前的序列化对象。False