打字猴:1.70043944e+09
1700439440
1700439441 //姓名
1700439442
1700439443 private String name;
1700439444
1700439445 //薪水
1700439446
1700439447 private transient Salary salary;
1700439448
1700439449 public Person(String_name, Salary_salary){
1700439450
1700439451 name=_name;
1700439452
1700439453 salary=_salary;
1700439454
1700439455 }
1700439456
1700439457 //序列化委托方法
1700439458
1700439459 private void writeObject(java.io.ObjectOutputStream out)throws IOException{
1700439460
1700439461 out.defaultWriteObject();
1700439462
1700439463 out.writeInt(salary.getBasePay());
1700439464
1700439465 }
1700439466
1700439467 //反序列化时委托方法
1700439468
1700439469 private void readObject(java.io.ObjectInputStream in)throws IOException, Class-
1700439470
1700439471 NotFoundException{
1700439472
1700439473 in.defaultReadObject();
1700439474
1700439475 salary=new Salary(in.readInt(),0);
1700439476
1700439477 }
1700439478
1700439479 }
1700439480
1700439481 其他代码不做任何改动,我们先运行看看,结果为:
1700439482
1700439483 姓名:张三 基本工资:1000 绩效工资:0。
1700439484
1700439485 我们在Person类中增加了writeObject和readObject两个方法,并且访问权限都是私有级别,为什么这会改变程序的运行结果呢?其实这里使用了序列化独有的机制:序列化回调。Java调用ObjectOutputStream类把一个对象转换成流数据时,会通过反射(Reflection)检查被序列化的类是否有writeObject方法,并且检查其是否符合私有、无返回值的特性。若有,则会委托该方法进行对象序列化,若没有,则由ObjectOutputStream按照默认规则继续序列化。同样,在从流数据恢复成实例对象时,也会检查是否有一个私有的readObject方法,如果有,则会通过该方法读取属性值。此处有几个关键点要说明:
1700439486
1700439487 (1)out. defaultWriteObject()
1700439488
1700439489 告知JVM按照默认的规则写入对象,惯例的写法是写在第一句话里。
[ 上一页 ]  [ :1.70043944e+09 ]  [ 下一页 ]