序列化

  所谓对象序列化就是将对象的状态转换成字节流,保存在文件中,以后可以通过读取文件再生成相同状态的对象。

  序列化:将数据分解成字节流,以便存储在文件(xx.dat)中或在网络上传输。

对象输出流Object  OutputStream

  反序列化:就是打开字节流并重构对象。

对象输入流Object  InputStream


java序列化比较简单,只需实现java.io.Serializable接口的类对象就可以转换成字节流或从字节流恢复。

把一个类序列化

SerialVersion UID: 1.默认  2.设置

Java序列化机制是通过在运行时判断类的SerialVersion UID来验证版本一致性的。

在进行反序列化时,JVM会把传来的字节流中的SerialVersionUID与本地相应实体的SerialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一样的异常InvalidCastException。

不想序列化的内容**

在属性前面加上关键字 :  transient

Users.java

 1 import java.io.Serializable;
 2 import java.util.Date;
 3 
 4 public class Users implements Serializable {
 5 
 6     private static final long serialVersionUID = 1L;
 7     //序列化版本ID
 8     
 9     private String username;
10     transient private String password;//说明一个属性是临时的,不会被序列化
11     private int experience;
12     private double money;
13     private Date regTime;
14 
15     @Override
16     public String toString() {
17         return "Users [username=" + username + ", password=" + password + ", experience=" + experience + ", money="
18                 + money + ", regTime=" + regTime + "]";
19     }
20 
21     public Users() {
22         super();
23         // TODO Auto-generated constructor stub
24     }
25 
26     public Users(String username, String password, int experience, double money, Date regTime) {
27         super();
28         this.username = username;
29         this.password = password;
30         this.experience = experience;
31         this.money = money;
32         this.regTime = regTime;
33     }
34 
35     public String getUsername() {
36         return username;
37     }
38 
39     public void setUsername(String username) {
40         this.username = username;
41     }
42 
43     public String getPassword() {
44         return password;
45     }
46 
47     public void setPassword(String password) {
48         this.password = password;
49     }
50 
51     public int getExperience() {
52         return experience;
53     }
54 
55     public void setExperience(int experience) {
56         this.experience = experience;
57     }
58 
59     public double getMoney() {
60         return money;
61     }
62 
63     public void setMoney(double money) {
64         this.money = money;
65     }
66 
67     public Date getRegTime() {
68         return regTime;
69     }
70 
71     public void setRegTime(Date regTime) {
72         this.regTime = regTime;
73     }
74 }

测试:

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.util.Date;
 8 
 9 public class SerializableDemo {
10 
11     public static void main(String[] args) {
12         //两个类的对象
13         ObjectInputStream in=null;
14         ObjectOutputStream out=null;
15         String fileName="g:"+File.separator+"Users.dat";
16         //要序列化的对象
17         Users user=new Users("张三丰","1234",1000,500.00,new Date());
18         
19         try
20         {
21             out=new ObjectOutputStream(new FileOutputStream(new File(fileName)));
22             in=new ObjectInputStream(new FileInputStream(new File(fileName)));
23             //通过序列化写入对象
24             out.writeObject(user);
25             //通过反序列化读对象
26             Users temp=(Users)in.readObject();
27             System.out.println(temp);
28         }
29         catch(Exception ex)
30         {
31             ex.printStackTrace();
32         }
33         finally
34         {
35             
36             try {
37                 out.close();
38                 in.close();
39             } catch (IOException e) {
40                 // TODO Auto-generated catch block
41                 e.printStackTrace();
42             }
43         }
44     }
45 }

结果:

Users [username=张三丰, password=null, experience=1000, money=500.0, regTime=Wed Apr 17 20:52:34 GMT+08:00 2019]

文件.dat只是一种扩展名---不会的时候就看一下它的百度百科。

原文地址:https://www.cnblogs.com/xjs1874704478/p/10726155.html