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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Java中,序列化和Externalable有什么區(qū)別?

在Java中,序列化和Externalable有什么區(qū)別?

人到中年有點(diǎn)甜 2019-07-08 15:36:09
在Java中,序列化和Externalable有什么區(qū)別?.之間的區(qū)別是什么?Serializable和Externalizable在爪哇?
查看完整描述

3 回答

?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個贊

序列化提供了存儲和稍后重新創(chuàng)建對象的默認(rèn)功能。它使用詳細(xì)的格式定義要存儲的整個對象圖,例如,假設(shè)您有一個linkedList,代碼如下所示,那么默認(rèn)的序列化將發(fā)現(xiàn)所有鏈接的對象并進(jìn)行序列化。在默認(rèn)序列化中,對象完全由其存儲的位構(gòu)成,沒有構(gòu)造函數(shù)調(diào)用。

  ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("/Users/Desktop/files/temp.txt"));
        oos.writeObject(linkedListHead); //writing head of linked list
        oos.close();

但是,如果您希望有限制的序列化,或者不希望您的對象的某些部分被序列化,那么請使用Externalable。Externalable接口擴(kuò)展了可序列化的接口,并添加了兩個方法:writeExoun()和readExoun()。它們在序列化或反序列化時自動調(diào)用。在使用Externalable時,我們應(yīng)該記住默認(rèn)構(gòu)造器應(yīng)該是公共的,否則代碼會拋出異常。請遵循以下代碼:

public class MyExternalizable implements Externalizable{private String userName;private String passWord;private Integer roll;
public MyExternalizable(){}public MyExternalizable(String userName, String passWord, Integer roll){
    this.userName = userName;
    this.passWord = passWord;
    this.roll = roll;}@Overridepublic void writeExternal(ObjectOutput oo) throws IOException {
    oo.writeObject(userName);
    oo.writeObject(roll);}@Overridepublic void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {
    userName = (String)oi.readObject();
    roll = (Integer)oi.readObject();}public String toString(){
    StringBuilder b = new StringBuilder();
    b.append("userName: ");
    b.append(userName);
    b.append("  passWord: ");
    b.append(passWord);
    b.append("  roll: ");
    b.append(roll);

    return b.toString();}public static void main(String[] args){
    try
    {
        MyExternalizable m  = new MyExternalizable("nikki", "student001", 20);
        System.out.println(m.toString());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/Desktop/files/temp1.txt"));
        oos.writeObject(m);
        oos.close();

        System.out.println("***********************************************************************");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/Users/Desktop/files/temp1.txt"));
        MyExternalizable mm = (MyExternalizable)ois.readObject();
        mm.toString();
        System.out.println(mm.toString());
    } 
    catch (ClassNotFoundException ex) 
    {
        Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
    }
    catch(IOException ex)
    {
        Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
    }}}

在這里,如果您注釋默認(rèn)構(gòu)造器,那么代碼將拋出在異常下面:

 java.io.InvalidClassException: javaserialization.MyExternalizable;     
 javaserialization.MyExternalizable; no valid constructor.

我們可以觀察到,由于密碼是敏感的信息,所以我不使用寫外部(ObjectOutput Oo)方法對其進(jìn)行序列化,也不會在readExoun(ObjectInput Oi)中設(shè)置它的值。這是Externalable提供的靈活性。

上述代碼的輸出如下:

userName: nikki  passWord: student001  roll: 20***********************************************************************userName: 
nikki  passWord: null  roll: 20

我們可以觀察到,因?yàn)槲覀儧]有設(shè)置密碼的值,所以它是空的。

也可以通過將密碼字段聲明為瞬態(tài)來實(shí)現(xiàn)同樣的目的。

private transient String passWord;

希望能幫上忙。如果我犯了什么錯,我道歉。謝謝。


查看完整回答
反對 回復(fù) 2019-07-08
?
夢里花落0921

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個贊

為了完整起見,transient關(guān)鍵字還可以縮小兩者之間的差距。

如果只想序列化對象的一部分,只需將特定字段設(shè)置為transient,將其標(biāo)記為不持久化,并實(shí)現(xiàn)Serializable.


查看完整回答
反對 回復(fù) 2019-07-08
  • 3 回答
  • 0 關(guān)注
  • 545 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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