通過(guò)實(shí)例了解java序列化機(jī)制
這篇文章主要介紹了通過(guò)實(shí)例了解java序列化機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
序列化是指對(duì)象通過(guò)寫(xiě)出描述自己狀態(tài)的數(shù)值來(lái)記錄自己的過(guò)程,即將對(duì)象表示成一系列有序字節(jié),Java提供了將對(duì)象寫(xiě)入流和從流中恢復(fù)對(duì)象的方法。對(duì)象能包含其它的對(duì)象,而其它的對(duì)象又可以包含另外的對(duì)象。Java序列化能夠自動(dòng)的處理嵌套的對(duì)象。對(duì)于一個(gè)對(duì)象的簡(jiǎn)單域,writeObject()直接將其值寫(xiě)入流中。
當(dāng)遇到一個(gè)對(duì)象域時(shí),writeObject()被再次調(diào)用,如果這個(gè)對(duì)象內(nèi)嵌另一個(gè)對(duì)象,那么,writeObject()又被調(diào)用,直到對(duì)象能被直接寫(xiě)入流為止。程序員所需要做的是將對(duì)象傳入ObjectOutputStream的writeObject()方法,剩下的將有系統(tǒng)自動(dòng)完成。
要實(shí)現(xiàn)序列化的類(lèi)必須實(shí)現(xiàn)的java.io.Serializable或java.io.Externalizable接口,否則將產(chǎn)生一個(gè)NotSerializableException。該接口內(nèi)部并沒(méi)有任何方法,它只是一個(gè)"tagging interface",僅僅"tags"它自己的對(duì)象是一個(gè)特殊的類(lèi)型。
類(lèi)通過(guò)實(shí)現(xiàn) java.io.Serializable接口以啟用其序列化功能。未實(shí)現(xiàn)此接口的類(lèi)將無(wú)法使其任何狀態(tài)序列化或反序列化??尚蛄谢?lèi)的所有子類(lèi)型本身都是可序列化的。
序列化接口沒(méi)有方法或字段,僅用于標(biāo)識(shí)可序列化的語(yǔ)義。Java的"對(duì)象序列化"能讓你將一個(gè)實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換成一組byte,這樣日后要用這個(gè)對(duì)象時(shí)候,你就能把這些byte數(shù)據(jù)恢復(fù)出來(lái),并據(jù)此重新構(gòu)建那個(gè)對(duì)象了。
代碼如下
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;
/*
* 對(duì)象流
* 用與存儲(chǔ)和讀取基本數(shù)據(jù)類(lèi)型數(shù)據(jù) 或 對(duì)象的處理劉。它的強(qiáng)大之處就是可以把java中的對(duì)象轉(zhuǎn)換成流
*
* */
public class ObjectInputStreamTeat {
/*
* 序列化過(guò)程:將內(nèi)存中的java對(duì)象保存到磁盤(pán)或通過(guò)網(wǎng)絡(luò)傳輸出去
* 使用ObjectOutputStream
* */
@Test
public void testObjectOutputStream() {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("Object.dat"));
oos.writeObject(new String("我是中國(guó)人"));
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實(shí)現(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類(lèi)要實(shí)現(xiàn)可序列化,必須實(shí)現(xiàn)可序列化接口Serializable
* 2.還需要添加一個(gè)最終類(lèi)屬性UID
* 3.除了當(dāng)前Person類(lèi)需要實(shí)現(xiàn)Serializable,還要保證其內(nèi)部所有屬性都是可序列化的
* (默認(rèn)情況下基本數(shù)據(jù)類(lèi)型為可序列化)
* 對(duì)象流不能序列化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();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)
為了解決 本地調(diào)試 的問(wèn)題,本文實(shí)現(xiàn)了一種簡(jiǎn)單實(shí)用的策略,可以通過(guò) Nacos 動(dòng)態(tài)配置服務(wù)路由,還可以基于用戶(hù),部門(mén),組織等級(jí)別配置服務(wù)路由,實(shí)現(xiàn) 本地調(diào)試 的同時(shí),實(shí)際上也實(shí)現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧2021-07-07
SpringBoot中的yaml語(yǔ)法及靜態(tài)資源訪問(wèn)問(wèn)題
這篇文章主要介紹了SpringBoot中的yaml語(yǔ)法及靜態(tài)資源訪問(wèn)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Java IText異常NoClassDefFoundError: org/bouncycastle
在使用Java進(jìn)行PDF文檔操作時(shí),iText是一個(gè)非常強(qiáng)大的庫(kù),然而,在實(shí)際開(kāi)發(fā)過(guò)程中,可能會(huì)遇到一些異常情況,其中之一就是??NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable??,本文將探討這個(gè)錯(cuò)誤的原因及其解決方案,需要的朋友可以參考下2025-02-02
SpringBoot項(xiàng)目使用validated實(shí)現(xiàn)參數(shù)校驗(yàn)框架
當(dāng)談到Spring的參數(shù)校驗(yàn)功能時(shí),@Validated注解無(wú)疑是一個(gè)重要的利器,它為我們提供了一種簡(jiǎn)單而又強(qiáng)大的方式來(lái)驗(yàn)證請(qǐng)求參數(shù)的合法性,保證了系統(tǒng)的穩(wěn)定性和安全性,本文將介紹Spring Validated的基本用法以及在實(shí)際項(xiàng)目中的應(yīng)用,需要的朋友可以參考下2024-05-05
使用IDEA將Java/Kotliin工程導(dǎo)出Jar包的正確姿勢(shì)
這篇文章主要介紹了使用IDEA將Java/Kotliin工程導(dǎo)出Jar包的正確姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java的分支結(jié)構(gòu)與循環(huán)你知道多少
這篇文章主要為大家詳細(xì)介紹了Java的分支結(jié)構(gòu)與循環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
springboot中不能獲取post請(qǐng)求參數(shù)的解決方法
這篇文章主要介紹了springboot中不能獲取post請(qǐng)求參數(shù)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
聊聊SpringBoot的@Scheduled的并發(fā)問(wèn)題
這篇文章主要介紹了聊聊SpringBoot的@Scheduled的并發(fā)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot登錄攔截配置詳解(實(shí)測(cè)可用)
這篇文章主要介紹了SpringBoot登錄攔截配置詳解(實(shí)測(cè)可用),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

