Java的序列化与反序列化(一):初识

Java提供了一种对象序列化的机制:一个对象可以被表示为一个字节序列,该字节序列包含对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

 

对象可序列化实现,只需要实现Serializable接口即可,实例:

【程序实例1】

 1 package SerializableTest;
 2 
 3 import java.io.Serializable;
 4 
 5 public class User implements Serializable {
 6 
 7     private static final long serialVersionUID = 3271953743747705799L;
 8 
 9     private String name;
10 
11     private String pwd;
12 
13     private transient String emial;
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public String getPwd() {
24         return pwd;
25     }
26 
27     public void setPwd(String pwd) {
28         this.pwd = pwd;
29     }
30 
31     public String getEmial() {
32         return emial;
33     }
34 
35     public void setEmial(String emial) {
36         this.emial = emial;
37     }
38 
39     @Override
40     public String toString() {
41         return "User{" +
42                 "name='" + name + '\'' +
43                 ", pwd='" + pwd + '\'' +
44                 ", emial='" + emial + '\'' +
45                 '}';
46     }
47 }

 

序列化对象

【程序实例2】

 1 import java.io.*;
 2 
 3 public class SerializeDemo {
 4 
 5     public static void main(String[] args){
 6 
 7         User user = new User();
 8         user.setName("amdin");
 9         user.setPwd("123456");
10         user.setEmial("admin@gmail.com");
11 
12         try{
13             FileOutputStream fileOut = new FileOutputStream("user.ser");
14             ObjectOutputStream out = new ObjectOutputStream(fileOut);
15             out.writeObject(user);
16             out.close();
17             fileOut.close();
18             System.out.println("序列化user对象到文件user.ser中: "+user);
19         } catch (FileNotFoundException e) {
20             e.printStackTrace();
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24 
25     }
26 
27 }

【运行结果】

1 序列化user对象到文件user.ser中: User{name='amdin', pwd='123456', emial='admin@gmail.com'}

 

反序列化对象

【程序实例3】

 1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.IOException;
 4 import java.io.ObjectInputStream;
 5 
 6 public class DeserializeDemo {
 7 
 8     public static void main(String[] args){
 9         try{
10             FileInputStream fileIn= new FileInputStream("user.ser");
11             ObjectInputStream in = new ObjectInputStream(fileIn);
12             User user = (User) in.readObject();
13             System.out.println("从文件user.ser中反序列化对象: "+user);
14         } catch (FileNotFoundException e) {
15             e.printStackTrace();
16         } catch (IOException e) {
17             e.printStackTrace();
18         } catch (ClassNotFoundException e) {
19             e.printStackTrace();
20         }
21     }
22 
23 }

【运行结果】

1 从文件user.ser中反序列化对象: User{name='amdin', pwd='123456', emial='null'}

 

transient关键字是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

 

参考资料:

1、http://www.runoob.com/java/java-serialization.html

2、http://www.hollischuang.com/archives/1140

 

posted @ 2017-01-09 14:53  Acode  阅读(440)  评论(0编辑  收藏  举报
您是本站第访问量位访问者!