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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

序列化反序列化api(入门级)

發布時間:2025/3/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 序列化反序列化api(入门级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義:

java序列化是指把Java對象轉換為字節序列的過程;而Java反序列化是指把字節序列恢復為Java對象的過程。

為什么字符串通常也會進行序列化?

對象需要進行序列化的原因:保證對象的狀態不變(比如一個studunet);

字符串通常也進行序列化的原因:為了保證解析不出意外(比如編碼可能不一致)(雖然字符串不序列化一般也不會報錯)。

同時以下原因也是一個很重要的因素:

對象、文件、數據,有許多不同的格式,很難統一傳輸和保存,

序列化以后就都是字節流了,無論原來是什么東西,都能變成一樣的東西,就可以進行通用的格式傳輸或保存,傳

輸結束以后,要再次使用,就進行反序列化還原,這樣對象還是對象,文件還是文件。

jdk提供的api:

java.io.ObjectOutputStream:表示對象輸出流

它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。

java.io.ObjectInputStream:表示對象輸入流

它的readObject()方法源輸入流中讀取字節序列,再把它們反序列化成為一個對象,并將其返回。

?

實現序列化的要求

只有實現了Serializable或Externalizable接口的類的對象才能被序列化,否則拋出異常。

實現Java對象序列化與反序列化的方法

假定一個Student類,它的對象需要序列化,可以有如下三種方法:

方法一:若Student類僅僅實現了Serializable接口,則可以按照以下方式進行序列化和反序列化

ObjectOutputStream采用默認的序列化方式,對Student對象的非transient的實例變量進行序列化。

ObjcetInputStream采用默認的反序列化方式,對對Student對象的非transient的實例變量進行反序列化。

方法二:若Student類不僅僅實現了Serializable接口,并且還定義了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),則采用以下方式進行序列化與反序列化。

ObjectOutputStream調用Student對象的writeObject(ObjectOutputStream out)的方法進行序列化。

ObjectInputStream會調用Student對象的readObject(ObjectInputStream in)的方法進行反序列化。

方法三:若Student類實現了Externalnalizable接口,且Student類必須實現readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,則按照以下方式進行序列化與反序列化。

ObjectOutputStream調用Student對象的writeExternal(ObjectOutput out))的方法進行序列化。

ObjectInputStream會調用Student對象的readExternal(ObjectInput in)的方法進行反序列化。

?

序列化的步驟:

步驟一:創建一個對象輸出流,它可以包裝一個其它類型的目標輸出流,如文件輸出流:

ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));

步驟二:通過對象輸出流的writeObject()方法寫對象:

out.writeObject(“Hello”);

out.writeObject(new Date());

?

反序列化的步驟:

步驟一:創建一個對象輸入流,它可以包裝一個其它類型輸入流,如文件輸入流:

ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));

步驟二:通過對象輸出流的readObject()方法讀取對象:

String obj1 = (String)in.readObject();

Date obj2 = (Date)in.readObject();

?

對String類型數據進行序列化反序列化demo:

public class SerializeAndDeserialize {

// 序列化
public static byte[] serialize(Object o){
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try{
baos= new ByteArrayOutputStream();
oos=new ObjectOutputStream(baos);
oos.writeObject(o);
byte[] bytes=baos.toByteArray();
return bytes;
}catch (Exception e){
e.printStackTrace();
}
return null;
}

// 反序列化
public static Object deserialize(byte [] bytes){
ByteArrayInputStream bai=null;
ObjectInputStream ois=null;
try {
bai=new ByteArrayInputStream(bytes);
ois=new ObjectInputStream(bai);
return ois.readObject();
}catch (Exception e){
e.printStackTrace();
}
return null;
}

public static void main(String []args){
System.out.println( serialize("asdasdasdad"));
System.out.println( deserialize(serialize("asdasdasdad")));
}
}

?

對實體類進行實例化:

實體類:

public class Student implements Serializable

{

?private String name;

?

?public Student()

?{}

?public Student(String name)

?{

? this.name = name;

?}

?public void setName(String name)

?{

? this.name = name;

?}

?public String getName()

?{

? return this.name;

?}

}

?

序列化反序列化:

public class UseStudent

{

?public static void main(String[] args)

?{

? Student st = new Student("Tom");

? File file = new File("E:\\student.txt");

? try

? {

? ?file.createNewFile();

? }

? catch(IOException e)

? {

? ?e.printStackTrace();

? }

? try

? {

? ?//Student對象序列化過程

? ?FileOutputStream fos = new FileOutputStream(file);

? ?ObjectOutputStream oos = new ObjectOutputStream(fos);

? ?oos.writeObject(st);

? ?oos.flush();

? ?oos.close();

? ?fos.close();

?

? ?//Student對象反序列化過程

? ?FileInputStream fis = new FileInputStream(file);

? ?ObjectInputStream ois = new ObjectInputStream(fis);

? ?Student st1 = (Student) ois.readObject();

? ?System.out.println("name = " + st1.getName());

? ?ois.close();

? ?fis.close();

? }

? catch(ClassNotFoundException e)

? {

? ?e.printStackTrace();

? }

? catch (IOException e)

? {

? ?e.printStackTrace();

? }

?}

}

以上。

達者為師,分享之上

參考博客:http://blog.csdn.net/wangloveall/article/details/7992448/

?

轉載于:https://www.cnblogs.com/zqsky/p/6088431.html

總結

以上是生活随笔為你收集整理的序列化反序列化api(入门级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。