java笔记九:对象序列化与反序列化   
               添加时间:2013-5-9 点击量: 
 
                在java法度运行过程中,有很多的对象同时存在,然则法度停止运行或者JVM停止运行时这些对象都邑消散。如何将这些对象保存起来以便下一次再将这些对象读入内存呢?或者如何将某些对象经由过程收集传到另一端的java法度?实验对象的这种操纵叫做对象的序列化(或者叫做持久化),从头读入内存叫做反序列化。
  根蒂根基数据类型的包装类和所有容器类都可以被序列化。用户自定义的类默认是不成以被序列化的。若是想要本身定义的类可以序列化就必须让这个类实现java.io.Serializable接口。
下面看一个Demo:
 1 package com.serializable;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.ObjectInputStream;
 8 import java.io.ObjectOutputStream;
 9 import java.io.Serializable;
10 
11 class Point implements Serializable{
12     private int x;
13     private int y;
14     private transient int z;  //用关键字transient润饰的属性不克不及参与序列化的过程
15     public Point(int x,int y,int z) {
16         this.x = x;
17         this.y = y;
18         this.z = z;
19     }
20     @Override
21     public String toString() {
22         return ( + x + , + y + , + z + );
23     }
24 }
25 
26 public class ObjectSerializableDemo {
27     
28     
29     public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
30         String fileName = F:\\shar\\test\\test7.txt;
31         //将二进制文件转换成一个对象输出流
32         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
33         for (int i = 0; i < 10; i++) {
34             oos.writeObject(new Point(i,2i,3i));
35         }
36         oos.flush();
37         oos.close();
38         
39         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
40         for (int i = 0; i < 10; i++) {
41             Point p = (Point)ois.readObject();
42             System.out.println(p +  );
43         }
44         ois.close();
45     }
46 
47 }
运行成果:
(0,0,0) 
(1,2,0) 
(2,4,0) 
(3,6,0) 
(4,8,0) 
(5,10,0) 
(6,12,0) 
(7,14,0) 
(8,16,0) 
(9,18,0)
  从运行成果可以看出,所有Piont类对象的z属性都没有被序列化。应为它被一个关键字transient润饰了,被这个关键字润饰的属性是不参与持久化的。
真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》
                     
                  
     
  
 
    
    
在java法度运行过程中,有很多的对象同时存在,然则法度停止运行或者JVM停止运行时这些对象都邑消散。如何将这些对象保存起来以便下一次再将这些对象读入内存呢?或者如何将某些对象经由过程收集传到另一端的java法度?实验对象的这种操纵叫做对象的序列化(或者叫做持久化),从头读入内存叫做反序列化。
根蒂根基数据类型的包装类和所有容器类都可以被序列化。用户自定义的类默认是不成以被序列化的。若是想要本身定义的类可以序列化就必须让这个类实现java.io.Serializable接口。
下面看一个Demo:
1 package com.serializable;
2
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.ObjectInputStream;
8 import java.io.ObjectOutputStream;
9 import java.io.Serializable;
10
11 class Point implements Serializable{
12 private int x;
13 private int y;
14 private transient int z; //用关键字transient润饰的属性不克不及参与序列化的过程
15 public Point(int x,int y,int z) {
16 this.x = x;
17 this.y = y;
18 this.z = z;
19 }
20 @Override
21 public String toString() {
22 return ( + x + , + y + , + z + );
23 }
24 }
25
26 public class ObjectSerializableDemo {
27
28
29 public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
30 String fileName = F:\\shar\\test\\test7.txt;
31 //将二进制文件转换成一个对象输出流
32 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
33 for (int i = 0; i < 10; i++) {
34 oos.writeObject(new Point(i,2i,3i));
35 }
36 oos.flush();
37 oos.close();
38
39 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
40 for (int i = 0; i < 10; i++) {
41 Point p = (Point)ois.readObject();
42 System.out.println(p + );
43 }
44 ois.close();
45 }
46
47 }
运行成果:
(0,0,0) 
(1,2,0) 
(2,4,0) 
(3,6,0) 
(4,8,0) 
(5,10,0) 
(6,12,0) 
(7,14,0) 
(8,16,0) 
(9,18,0)
从运行成果可以看出,所有Piont类对象的z属性都没有被序列化。应为它被一个关键字transient润饰了,被这个关键字润饰的属性是不参与持久化的。
真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》




