java 一天_一天一个Java基础——序列化

1.概念

Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象。

对象序列化能实现“轻量级persistence(lightweight persistence)”。所谓persistence,是指对象的生命周期不是由程序是否运行决定的,在程序的两次调用之间对象仍然还活着。通过“将做过序列化处理的对象写入磁盘,等到程序再次运行的时候再把它读出来”,可以达到persistence的效果。

之所以要在语言里加入对象序列化,是因为要用它来实现两个重要的功能:

1.Java的远程方法调用能像调用自己机器上的对象那样去调用其它机器上的对象。

2.对JavaBean来说,Bean的状态信息通常是在设计时配置的,这些状态信息必须保存起来,供程序启动的时候用,对象序列化就负责这个工作。

对象序列化不仅能保存对象的副本,而且还会跟着对象中的reference把它所引用的对象也保存起来,然后再继续跟踪那些对象的reference。

2.实现序列化

(1)序列化一个对象只要让它实现Serializable接口就行了(这是一个“标记接口”,tagging interface,没有任何方法)。

(2)要想序列化对象,必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这是就能用writeObject()方法把对象写入OutputStream。

(3)读的时候需要把InputStream嵌到ObjectInputStream中,然后再调用readObject()方法。

3.样例

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packageEntity;2

3 importjava.io.Serializable;4

5 public class Employee implementsSerializable{6

7 /*

8 * serialVersionUID作用:9 * 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。10 * 如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),11 * 当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。12 * 但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。13 */

14 private static final long serialVersionUID = -5167690587890199758L;15

16 publicString name;17 publicString address;18 public transient intSSN;19 public intnumber;20 publicDepartment department;21

22 publicString toString() {23 return "Employee [name=" + name + ", address=" + address + ", number=" + number + "]";24 }25

26 }

Employee.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packageEntity;2

3 importjava.io.Serializable;4

5 public class Department implementsSerializable{6 private static final long serialVersionUID = -6913084898834515327L;7

8 public intid;9 publicString name;10

11 publicString toString() {12 return "Department [id=" + id + ", name=" + name + "]";13 }14

15 }

Department.java

1 packageTest;2

3 importjava.io.File;4 importjava.io.FileInputStream;5 importjava.io.FileOutputStream;6 importjava.io.IOException;7 importjava.io.ObjectInputStream;8 importjava.io.ObjectOutputStream;9

10 importEntity.Department;11 importEntity.Employee;12

13 public classtest1 {14

15 /**

16 * 序列化对象17 */

18 @org.junit.Test19 public voidSerializeDemo() {20 Employee e = newEmployee();21 e.name = "Reyan Ali";22 e.address = "Phokka Kuan, Ambehta Peer";23 e.SSN = 11122333;24 e.number = 101;25 Department d = newDepartment();26 d.id = 1;27 d.name = "Java研发";28 e.department =d;29 try{30 System.out.println(e);31 FileOutputStream fileOut = new FileOutputStream(new File("/Users/zhengbinMac/employee.txt"));32 ObjectOutputStream out = newObjectOutputStream(fileOut);33 System.out.println(e);34 out.writeObject(e);35 out.close();36 fileOut.close();37 System.out.printf("Serialized data is saved in /Users/zhengbinMac/employee.txt");38 } catch(IOException i) {39 i.printStackTrace();40 }41 }42

43 /**

44 * 反序列化对象45 */

46 @org.junit.Test47 public voidDeserializeDemo() {48 Employee e = null;49 try{50 FileInputStream fileIn = new FileInputStream("/Users/zhengbinMac/employee.txt");51 ObjectInputStream in = newObjectInputStream(fileIn);52 e =(Employee) in.readObject();53 in.close();54 fileIn.close();55 } catch(IOException i) {56 i.printStackTrace();57 return;58 } catch(ClassNotFoundException c) {59 System.out.println("Employee class not found");60 c.printStackTrace();61 return;62 }63 System.out.println("Deserialized Employee...");64 System.out.println("Name: " +e.name);65 System.out.println("Address: " +e.address);66 System.out.println("SSN: " +e.SSN);67 System.out.println("Number: " +e.number);68 System.out.println("Department: " +e.department);69 }70 }

相关博文:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值