日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java 序列化实例_Java中的序列化与反序列化实例

發(fā)布時(shí)間:2024/7/23 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 序列化实例_Java中的序列化与反序列化实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

創(chuàng)建的字節(jié)流與平臺(tái)無關(guān)。因此,在一個(gè)平臺(tái)上序列化的對(duì)象可以在另一個(gè)平臺(tái)上反序列化。

為了使Java對(duì)象可序列化,我們實(shí)現(xiàn)java.io.Serializable可序列化接口。

ObjectOutputStream類包含writeObject()序列化對(duì)象的方法。

public final voidwriteObject(Object obj)throws IOException

ObjectInputStream類包含readObject()用于反序列化對(duì)象的方法。

public finalObject readObject()throwsIOException,ClassNotFoundException

1、序列化的優(yōu)點(diǎn)

保存/保持對(duì)象的狀態(tài)。

在網(wǎng)絡(luò)中傳輸一個(gè)物體。

只有那些類的對(duì)象可以序列化,這些類正在實(shí)現(xiàn)java.io.Serializable可序列化接口。

可序列化是標(biāo)記接口(沒有數(shù)據(jù)成員和方法)。它用于“標(biāo)記”java類,以便這些類的對(duì)象可以獲得一定的功能。標(biāo)記接口的其他示例包括:Cloneable and Remote.

2、要點(diǎn)

1如果父類實(shí)現(xiàn)了可序列化接口,則子類不需要實(shí)現(xiàn)它,反之亦然。

2只有非靜態(tài)數(shù)據(jù)成員通過序列化過程保存。

3static數(shù)據(jù)成員和transient數(shù)據(jù)成員不會(huì)通過序列化過程保存。所以,如果您不想保存非靜態(tài)數(shù)據(jù)成員的值,請(qǐng)將其設(shè)為transient。

4反序列化對(duì)象時(shí)從不調(diào)用對(duì)象的構(gòu)造函數(shù)。

5關(guān)聯(lián)對(duì)象必須實(shí)現(xiàn)可序列化接口。

例子:

class A implementsSerializable{//B also implements Serializable//interface.

B ob=newB();

}

3、SerialVersionUID(序列號(hào))

序列化運(yùn)行時(shí)將一個(gè)版本號(hào)與每個(gè)稱為SerialVersionUID的可序列化類相關(guān)聯(lián),在反序列化過程中使用該序列號(hào)驗(yàn)證序列化對(duì)象的發(fā)送方和接收方是否為該對(duì)象加載了與序列化兼容的類。如果接收方為對(duì)象加載的類的UID與相應(yīng)發(fā)送方類的UID不同,則反序列化將導(dǎo)致InvalidClassException.?可序列化類可以通過聲明字段名來顯式聲明自己的UID。

它必須是static、final和long類型。

l例如:(public/private/protected/default) static final long serialVersionUID=42L;

如果可序列化類沒有顯式聲明serialVersionUID,則序列化運(yùn)行時(shí)將根據(jù)類的各個(gè)方面為該類計(jì)算默認(rèn)值,如Java對(duì)象序列化規(guī)范中所述。但是,強(qiáng)烈建議所有可序列化類顯式聲明serialVersionUID值,因?yàn)樗挠?jì)算對(duì)類細(xì)節(jié)高度敏感,這些細(xì)節(jié)可能因編譯器實(shí)現(xiàn)而異,因此類中的任何更改或使用不同的id都可能影響序列化的數(shù)據(jù)。

還建議對(duì)UID使用private修飾符,因?yàn)樗鳛槔^承成員沒有用處。

4、serialver(串行器)

serialver是JDK附帶的工具。它用于獲取Java類的serialVersionUID號(hào)。

您可以運(yùn)行以下命令來獲取serialVersionUID

serialver [-classpath classpath] [-show] [classname…]

例1:

//Java code for serialization and deserialization//of a Java object

import java.io.*;class Demo implementsjava.io.Serializable

{public inta;publicString b;//Default constructor

public Demo(inta, String b)

{this.a =a;this.b =b;

}

}classTest

{public static voidmain(String[] args)

{

Demo object= new Demo(1, "geeksforgeeks");

String filename= "file.ser";//Serialization

try{//Saving of object in a file

FileOutputStream file = newFileOutputStream(filename);

ObjectOutputStream out= newObjectOutputStream(file);//Method for serialization of object

out.writeObject(object);

out.close();

file.close();

System.out.println("Object has been serialized");

}catch(IOException ex)

{

System.out.println("IOException is caught");

}

Demo object1= null;//Deserialization

try{//Reading the object from a file

FileInputStream file = newFileInputStream(filename);

ObjectInputStream in= newObjectInputStream(file);//Method for deserialization of object

object1 =(Demo)in.readObject();

in.close();

file.close();

System.out.println("Object has been deserialized ");

System.out.println("a = " +object1.a);

System.out.println("b = " +object1.b);

}catch(IOException ex)

{

System.out.println("IOException is caught");

}catch(ClassNotFoundException ex)

{

System.out.println("ClassNotFoundException is caught");

}

}

}

輸出:

Object has been serialized

Object has been deserialized

a= 1b= geeksforgeeks

例2:

//Java code for serialization and deserialization//of a Java object

import java.io.*;class Emp implementsSerializable {private static final long serialversionUID =

129348938L;transient inta;static intb;

String name;intage;//Default constructor

public Emp(String name, int age, int a, intb)

{this.name =name;this.age =age;this.a =a;this.b =b;

}

}public classSerialExample {public static voidprintdata(Emp object1)

{

System.out.println("name = " +object1.name);

System.out.println("age = " +object1.age);

System.out.println("a = " +object1.a);

System.out.println("b = " +object1.b);

}public static voidmain(String[] args)

{

Emp object= new Emp("ab", 20, 2, 1000);

String filename= "shubham.txt";//Serialization

try{//Saving of object in a file

FileOutputStream file = newFileOutputStream

(filename);

ObjectOutputStream out= newObjectOutputStream

(file);//Method for serialization of object

out.writeObject(object);

out.close();

file.close();

System.out.println("Object has been serialized\n"

+ "Data before Deserialization.");

printdata(object);//value of static variable changed

object.b = 2000;

}catch(IOException ex) {

System.out.println("IOException is caught");

}

object= null;//Deserialization

try{//Reading the object from a file

FileInputStream file = newFileInputStream

(filename);

ObjectInputStream in= newObjectInputStream

(file);//Method for deserialization of object

object =(Emp)in.readObject();

in.close();

file.close();

System.out.println("Object has been deserialized\n"

+ "Data after Deserialization.");

printdata(object);//System.out.println("z = " + object1.z);

}catch(IOException ex) {

System.out.println("IOException is caught");

}catch(ClassNotFoundException ex) {

System.out.println("ClassNotFoundException" +

" is caught");

}

}

}

輸出:

Object has been serialized

Data before Deserialization.

name=ab

age= 20a= 2b= 1000Object has been deserialized

Data after Deserialization.

name=ab

age= 20a= 0b= 2000

輸出說明:

在反序列化對(duì)象時(shí),您已經(jīng)看到a和b的值發(fā)生了更改。原因a是transient修飾 ,b是static修飾。

transient:在序列化過程中,使用transient關(guān)鍵字定義的變量未序列化。在反序列化期間,將使用默認(rèn)值初始化此變量。(例如:Object為null,int為0)

static:使用static關(guān)鍵字定義的變量在序列化過程中未序列化。在反序列化期間,將使用類中定義的當(dāng)前值加載此變量。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java 序列化实例_Java中的序列化与反序列化实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。