所谓对象序列化就是将对象的状态转换成字节流,保存在文件中,以后可以通过读取文件再生成相同状态的对象。
序列化:将数据分解成字节流,以便存储在文件(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只是一种扩展名---不会的时候就看一下它的百度百科。