第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

JAVA優(yōu)化建議(2)

標(biāo)簽:
Java

1.显式声明UID
如果不显式声明,生产者和消费者的字段不一样的时候,JVM根据类名,参数等自动生成的序列就会不一样,会报InvaidClassException,但是如果双方显式声明serialVerisonUID 就不会。
显式声明serialVersionUID可以避免对象不一致,但尽量不要以这种方式向JVM“撒谎”。

2.在序列化类中,不使用构造函数为final变量赋值
当序列化UID不变的时候,反序列化时,构造函数不会执行。所以改变赋值却不会生效。
总结,反序列化时final变量在以下情况不会被重新赋值:
1.通过构造函数为final变量赋值
2.通过方法返回值为final变量赋值
3.final修饰的属性不是基本类型
So,避免为final变量复杂赋值

3.使用序列化类的私有方法,巧妙解决部分属性持久化问题
例如属于场景:
有一个计税系统和HR系统,计税系统需要从HR系统中获取人员的姓名和基本工资,而HR系统工资包括基本工资和奖金,奖金属于个人隐私,不能泄露给外系统。
Salary设计如下:

public class Salary implements Serializable {
    private static final long serialVersionUID = 1L;
    private int basePay;
    private transient int bonus;

    public Salary(int _basePay, int _bonus) {
        basePay = _basePay;
        bonus = _bonus;
     }
     省略set,get方法
     }

Person设计如下:

public class Person implements Serializable {
  private static final long serialVersionUID = 2L;
  private String name;
  private Salary salary;

  public Person(String _name, Salary _salary) {
      name = _name;
      salary = _salary;
  }
省略set,get方法

}

反序列化代码如下:

public class Customer {
  public static void main(String[] args){
  
      Person person =(Person)SerializationUtils.readObject();
      StringBuffer stringBuffer=new StringBuffer();
      stringBuffer.append("name....."+person.getName());
      stringBuffer.append("\tbasePay....."+person.getSalary().getBasePay());
      stringBuffer.append("\tbonus....."+person.getSalary().getBonus());
      System.out.println(stringBuffer);
  }
}

打印如下:
name…张静 basePay…1000 bonus…2500
显然不符合要求。
改进方案
1.在bonus字段前加transient,使得Salary类失去分布部署的功能
2.再增加额外的对象只包括姓名和基本工资,但增加了代码量
3.请求时候过滤,不符合日常设计
4.用XML传输,成本太高

比较好的方法
改造Person类,实现Serialzable接口的两个私有的方法:writeObject和readObject,影响和控制序列化和反序列化过程。

private void writeObject(ObjectOutputStream out) throws IOException{
        out.defaultWriteObject();
        out.writeObject(salary.getBasePay());
    }

   private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {

       in.defaultReadObject();
       salary=new Salary(in.readInt(),0);
   }
點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開(kāi)發(fā)工程師
手記
粉絲
0
獲贊與收藏
3

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消