日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
講解一下java中的序列化和反序列化

序列化和反序列化幾乎是工程師們每天都要面對的事情,但是要精確掌握這兩個概念并不容易:一方面,它們往往作為框架的一部分出現(xiàn)而湮沒在框架之中;另一方面,它們會以其他更容易理解的概念出現(xiàn),例如加密、持久化。然而,序列化和反序列化的選型卻是系統(tǒng)設(shè)計或重構(gòu)一個重要的環(huán)節(jié),在分布式、大數(shù)據(jù)量系統(tǒng)設(shè)計里面更為顯著。

成都創(chuàng)新互聯(lián)是專業(yè)的榆次網(wǎng)站建設(shè)公司,榆次接單;提供成都網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行榆次網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

1、什么是序列化?為什么要序列化?

Java 序列化就是指將對象轉(zhuǎn)換為字節(jié)序列的過程,而反序列化則是只將字節(jié)序列轉(zhuǎn)換成目標(biāo)對象的過程。

我們都知道,在進(jìn)行瀏覽器訪問的時候,我們看到的文本、圖片、音頻、視頻等都是通過二進(jìn)制序列進(jìn)行傳輸?shù)?,那么如果我們需要將Java對象進(jìn)行傳輸?shù)臅r候,是不是也應(yīng)該先將對象進(jìn)行序列化?答案是肯定的,我們需要先將Java對象進(jìn)行序列化,然后通過網(wǎng)絡(luò),IO進(jìn)行傳輸,當(dāng)?shù)竭_(dá)目的地之后,再進(jìn)行反序列化獲取到我們想要的對象,最后完成通信。

2、如何實現(xiàn)序列化

2.1、使用到JDK中關(guān)鍵類 ObjectOutputStream 和ObjectInputStream

ObjectOutputStream 類中:通過使用writeObject(Object object) 方法,將對象以二進(jìn)制格式進(jìn)行寫入。

ObjectInputStream 類中:通過使用readObject()方法,從輸入流中讀取二進(jìn)制流,轉(zhuǎn)換成對象。

**2.2、目標(biāo)**對象需要先實現(xiàn) Seriable接口

我們創(chuàng)建一個Student類:

public class Student implements Serializable {
   private static final long serialVersionUID = 3404072173323892464L;
   private String name;
   private transient String id;
   private String age;

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +                ", id='" + id + '\'' +                ", age='" + age + '\'' +
               '}';
   }

   public String getAge() {
       return age;
   }

   public void setAge(String age) {
       this.age = age;
   }

   public Student(String name, String id) {
       System.out.println("args Constructor");
       this.name = name;
       this.id = id;
   }

   public Student() {
       System.out.println("none-arg Constructor");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getId() {
       return id;
   }

   public void setId(String id) {
       this.id = id;
   }

}

代碼中Student類實現(xiàn)了Serializable 接口,并且生成了一個版本號:

private` `static` `final` `long` `serialVersionUID = 3404072173323892464L;

首先:

1、Serializable 接口的作用只是用來標(biāo)識我們這個類是需要進(jìn)行序列化,并且Serializable 接口中并沒有提供任何方法。

2、serialVersionUid 序列化版本號的作用是用來區(qū)分我們所編寫的類的版本,用于判斷反序列化時類的版本是否一直,如果不一致會出現(xiàn)版本不一致異常。

3、transient 關(guān)鍵字,主要用來忽略我們不希望進(jìn)行序列化的變量

2.3、將對象進(jìn)行序列或和反序列化

2.3.1 第一種寫入方式:

public static  void main(String[] args){
       File file = new File("D:/test.txt");
       Student student = new Student("孫悟空","12");
       try {
           ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
           outputStream.writeObject(student);
           outputStream.close();
       } catch (IOException e) {
           e.printStackTrace();
       }

       try {
           ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
           Student s = (Student) objectInputStream.readObject();
           System.out.println(s.toString());
           System.out.println(s.equals(student));
       } catch (IOException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
   }

創(chuàng)建對象Student ,然后通過ObjectOutputStream類中的writeObject()方法,將對象輸出到文件中。

然后通過ObjectinputStream 類中的readObject()方法反序列化,獲取對象。

2.3.2 第二種寫入方式:

在Student 類中實現(xiàn)writeObject()和readObject()方法:

  private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
       objectOutputStream.defaultWriteObject();
       objectOutputStream.writeUTF(id);

   }

   private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
       objectInputStream.defaultReadObject();
       id = objectInputStream.readUTF();
   }

通過這中方式進(jìn)行序列話,我們可以自定義想要進(jìn)行序列化的變量,將輸入流和輸出流傳入對線實例中,然后進(jìn)行序列化以及反序列化。

2.3.3 第三種寫入方式:

Student 實現(xiàn) *Externalnalizable接口 而不實現(xiàn)Serializable 接口*

*Externaliable 接口是 Serializable 的子類,有著和Serializable接口同樣的功能:*

public class Student implements Externalizable {
   private static final long serialVersionUID = 3404072173323892464L;
   private String name;
   private transient String id;
   private String age;

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +                ", id='" + id + '\'' +                ", age='" + age + '\'' +
               '}';
   }

   public String getAge() {
       return age;
   }

   public void setAge(String age) {
       this.age = age;
   }

   public Student(String name, String id) {
       System.out.println("args Constructor");
       this.name = name;
       this.id = id;
   }

   public Student() {
       System.out.println("none-arg Constructor");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getId() {
       return id;
   }

   public void setId(String id) {
       this.id = id;
   }


   @Override
   public void writeExternal(ObjectOutput out) throws IOException {
       out.writeObject(name);
       out.writeObject(id);
   }

   @Override
   public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
       name = (String) in.readObject();
       id = (String) in .readObject();
   }

}

通過和前面的第二種寫入方法對比,我們可以發(fā)現(xiàn)他們的實現(xiàn)原理都是十分的類似,不過實現(xiàn)Externalnalizable接口 并不支持第一種序列化方法,它只能夠通過實現(xiàn)接口中的writeExternal()和readExternal()方法實現(xiàn)對象的序列化。

3、面試中關(guān)于序列化的問題:

1、什么是序列化,如何實現(xiàn)序列化

java中對象的序列化就是將對象轉(zhuǎn)換成二進(jìn)制序列,反序列化則是將二進(jìn)制序列轉(zhuǎn)換成對象

Java 實現(xiàn)序列化有多種方式

1、首先需要使用到工具類ObjectInputStream 和ObjectOutputStream 兩個IO類

2、實現(xiàn)Serializable 接口:

有兩種具體序列化方法:

2.1 直接通過ObjectOutputStream 和 ObjectInputStream 類中的 writeObject()和readObject()方法

2.2 通過在序列化對象中實現(xiàn)writeObject()和readObject()方法,傳入ObjectOutputStream和ObjectInputStream對象,完成序列化

3、實現(xiàn)Externalizable 接口:


當(dāng)前名稱:講解一下java中的序列化和反序列化
當(dāng)前地址:http://m.5511xx.com/article/dpoophp.html