溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java序列化機制的示例分析

發(fā)布時間:2021-07-23 10:04:30 來源:億速云 閱讀:141 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)java序列化機制的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

序列化是指對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己的過程,即將對象表示成一系列有序字節(jié),Java提供了將對象寫入流和從流中恢復(fù)對象的方法。對象能包含其它的對象,而其它的對象又可以包含另外的對象。Java序列化能夠自動的處理嵌套的對象。對于一個對象的簡單域,writeObject()直接將其值寫入流中。

當(dāng)遇到一個對象域時,writeObject()被再次調(diào)用,如果這個對象內(nèi)嵌另一個對象,那么,writeObject()又被調(diào)用,直到對象能被直接寫入流為止。程序員所需要做的是將對象傳入ObjectOutputStream的writeObject()方法,剩下的將有系統(tǒng)自動完成。

要實現(xiàn)序列化的類必須實現(xiàn)的java.io.Serializable或java.io.Externalizable接口,否則將產(chǎn)生一個NotSerializableException。該接口內(nèi)部并沒有任何方法,它只是一個"tagging interface",僅僅"tags"它自己的對象是一個特殊的類型。

類通過實現(xiàn) java.io.Serializable接口以啟用其序列化功能。未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化??尚蛄谢惖乃凶宇愋捅旧矶际强尚蛄谢?。

序列化接口沒有方法或字段,僅用于標(biāo)識可序列化的語義。Java的"對象序列化"能讓你將一個實現(xiàn)了Serializable接口的對象轉(zhuǎn)換成一組byte,這樣日后要用這個對象時候,你就能把這些byte數(shù)據(jù)恢復(fù)出來,并據(jù)此重新構(gòu)建那個對象了。

代碼如下

package stream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import javax.security.auth.login.AccountException;

import org.junit.jupiter.api.Test;

/*
 * 對象流
 *   用與存儲和讀取基本數(shù)據(jù)類型數(shù)據(jù) 或 對象的處理劉。它的強大之處就是可以把java中的對象轉(zhuǎn)換成流
 * 
 * */

public class ObjectInputStreamTeat {
  /*
   * 序列化過程:將內(nèi)存中的java對象保存到磁盤或通過網(wǎng)絡(luò)傳輸出去
   * 使用ObjectOutputStream 
   * */
  @Test
  public void testObjectOutputStream() {
    ObjectOutputStream oos = null;
    try {
      oos = new ObjectOutputStream(new FileOutputStream("Object.dat"));
      oos.writeObject(new String("我是中國人"));
      oos.flush();
      
      oos.writeObject(new Person("zsben",1,new Account(2000)));
      oos.flush();
      
    } catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      try {
        if(oos!=null)
          oos.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  
  /*
   * 反序列化:用ObjectInputStream實現(xiàn)
   * */
  @Test
  public void testObjectInputStream() {
    ObjectInputStream ois = null;
    try {
      ois = new ObjectInputStream(new FileInputStream("Object.dat"));
      Object object = ois.readObject();
      String string = (String)object;
      System.out.println(string);
      
      Object object2 = ois.readObject();
      Person person = (Person)object2;
      System.out.println(person);
      
    } catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      try {
        if(ois!=null)
          ois.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}
/*
 * 1.Person類要實現(xiàn)可序列化,必須實現(xiàn)可序列化接口Serializable
 * 2.還需要添加一個最終類屬性UID
 * 3.除了當(dāng)前Person類需要實現(xiàn)Serializable,還要保證其內(nèi)部所有屬性都是可序列化的
 *   (默認情況下基本數(shù)據(jù)類型為可序列化)
 * 對象流不能序列化static 和transient修飾的成員
 * */
class Person implements Serializable{
  public static final long serivalVersionUID = 5432146546351568416L;
  
  private String name;
  private static int age;
  private Account account; 
  @Override
  public String toString() {
    return "Person [name=" + name + ", age=" + age + ", account=" + account + "]";
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
  }
  
  public Person(String name, int age, Account account) {
    super();
    this.name = name;
    this.age = age;
    this.account = account;
  }
  public Person() {
    super();
  }  
}
class Account implements Serializable{
  private double balance;
  static final public long serivalVersionUID = 54685237864535874L;
  @Override
  public String toString() {
    return "Account [balance=" + balance + "]";
  }

  public double getBalance() {
    return balance;
  }

  public void setBalance(double balance) {
    this.balance = balance;
  }

  public Account(double balance) {
    super();
    this.balance = balance;
  }

  public Account() {
    super();
  }
}

感謝各位的閱讀!關(guān)于“java序列化機制的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI