通過實例了解java序列化機制
這篇文章主要介紹了通過實例了解java序列化機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
序列化是指對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己的過程,即將對象表示成一系列有序字節(jié),Java提供了將對象寫入流和從流中恢復對象的方法。對象能包含其它的對象,而其它的對象又可以包含另外的對象。Java序列化能夠自動的處理嵌套的對象。對于一個對象的簡單域,writeObject()直接將其值寫入流中。
當遇到一個對象域時,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)序列化或反序列化??尚蛄谢惖乃凶宇愋捅旧矶际强尚蛄谢摹?/p>
序列化接口沒有方法或字段,僅用于標識可序列化的語義。Java的"對象序列化"能讓你將一個實現(xiàn)了Serializable接口的對象轉換成一組byte,這樣日后要用這個對象時候,你就能把這些byte數(shù)據(jù)恢復出來,并據(jù)此重新構建那個對象了。
代碼如下
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中的對象轉換成流
*
* */
public class ObjectInputStreamTeat {
/*
* 序列化過程:將內(nèi)存中的java對象保存到磁盤或通過網(wǎng)絡傳輸出去
* 使用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.除了當前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();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
druid?handleException執(zhí)行流程源碼解析
這篇文章主要為大家介紹了druid?handleException執(zhí)行流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
SpringBoot3和mybatis-plus整合出現(xiàn)的問題解決辦法
SpringBoot和MybatisPlus的整合可以讓我們更加方便地進行數(shù)據(jù)庫操作,這篇文章主要給大家介紹了關于SpringBoot3和mybatisplus整合出現(xiàn)的一些問題的相關資料,需要的朋友可以參考下2024-01-01
如何解決Spring in action @valid驗證不生效的問題
這篇文章主要介紹了如何解決Spring in action @valid驗證不生效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
java使用PDFRenderer實現(xiàn)預覽PDF功能
這篇文章主要為大家詳細介紹了java使用PDFRenderer實現(xiàn)預覽PDF功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
mybatis中關于type-aliases-package的使用
這篇文章主要介紹了mybatis中關于type-aliases-package的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

