一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java序列化(Serialization) 機制

Java序列化(Serialization) 機制

2020-05-25 12:07java教程網 JAVA教程

本篇文章是對Java中對象的序列化(Serialization) 機制進行了詳細的分析介紹,并附實例,需要的朋友可以參考下

  Java中,一切都是對象,在分布式環境中經常需要將Object從這一端網絡或設備傳遞到另一端。這就需要有一種可以在兩端傳輸數據的協議。Java序列化機制就是為了解決這個問題而產生。

將對象狀態轉換成字節流之后,可以用java.io包中各種字節流的類將其保存到文件中,管道到另一線程中或通過網絡連接將對象數據發送到另一主機。對象序列化功能非常簡單、強大,在RMI、Socket、JMS、EJB都有應用。對象序列化問題在網絡編程中并不是最核心的課題,但卻相當重要,具有許多實用意義。

java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入字節流中,可以保存在文件中或在網絡連接上傳遞。利用對象序列化可以進行對象的“深復制”,即復制對象本身及引用的對象本身。序列化一個對象可能得到整個對象的序列。

基本使用方法:  

      Serialization是指把類或者基本的數據類型持久化(persistence)到數據流(Stream)中,包括文件、字節流、網絡數據流。

JAVA中實現serialization主要靠兩個類:ObjectOuputStream和ObjectInputStream。他們是JAVA IO系統里的OutputStream和InputStream的子類。既然他們是JAVA IO中的流,那么就可以像操作一般的流一樣來操作他們。下面是他們使用方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
public class Pair implements Serializable{
 
 private static final long serialVersionUID = -1874850715617681161L;
 private int type;
 private String name;
 
 public int getType() {
 return type;
 }
 
 public void setType(int type) {
 this.type = type;
 }
 
 public String getName() {
 return name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
 
 
 public Pair(int type, String name) {
 super();
 this.type = type;
 this.name = name;
 }
 
 public static void main(String[] args) throws IOException, ClassNotFoundException {
 // TODO Auto-generated method stub
 //serialize object pair
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(bos);
 Pair pair = new Pair(1, "charlie");
 oos.writeObject(pair);
 //deserialize object, get new object newpair
 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
 ObjectInputStream ois = new ObjectInputStream(bis);
 Pair newpair = (Pair) ois.readObject();
 
 System.out.println(newpair.getType()+":"+newpair.getName());
 }
}

1. 這兩個類都是decorator模式的,在創建他們的時候,都要傳入一個基于字節的流,真正在底下存貯序列化數據的都是這些流。

 2. 被持久化的類要實現Serializable接口,這個接口沒有任何函數,只是一個標記接口。如果在一臺機器上進行序列化,把得到的數據傳送到另外一個機器上進行反序列化,那么這兩臺機器上的類應該是完全一樣的,否則序列化是不會成功的。

 3. 切記不要把上面代碼中的bos用toString得到String,然后再從這個String中得到ByteArrayInputStream,再進行反序列化。bos是以字節存貯的,轉成以字符存貯的String必然會造成數據的變化,而從String中到的byte[]也不會是之前那個byte[]了。我遇到過這個問題,是因為我想把序列化之后的數據存在xml文件中。

java虛擬機在序列化和反序列化的時候都做了些什么?

javadoc中對這兩個類的描述中對java的序列化機制進行了詳細的描述:

引用

The default serialization mechanism for an object writes the class of the object, the class signature, and the values of all non-transient and non-static fields. References to other objects (except in transient or static fields) cause those objects to be written also. Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.

默認的序列化機制寫到流中的數據有:

1、對象所屬的類
2、類的簽名
3、所有的非transient和非static的屬性
4、對其他對象的引用也會造成對這些對象的序列化
5、如果多個引用指向一個對象,那么會使用sharing reference機制

引用

Classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:

?
1
2
3
4
5
6
private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException
private void readObjectNoData()
 throws ObjectStreamException;

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 鄂州一家三口完整版免费 | 日本三级欧美三级人妇英文 | 91精品国产综合久久消防器材 | 天美网站传媒入口网址 | 国产精品免费精品自在线观看 | 国产成人亚洲综合网站不卡 | 久久精品热99看 | x8x8在线永久免费观看 | 福利一区在线观看 | 舔小说| 亚洲国产成人99精品激情在线 | 日产欧产va高清 | 久久精品中文騷妇女内射 | 欧美a一片xxxx片与善交 | 国产亚洲精aa在线观看不卡 | 精品视频在线观看 | 日本人泡妞18xxⅹ | 秋霞午夜视频在线观看 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 美女用手扒开粉嫩的屁股 | 黄 色 成 年人在线 幻女free性俄罗斯第一次摘花 | 爱爱亚洲 | 国产伦精品一区二区三区女 | 国产91精品久久久久久久 | 性绞姿始动作动态图 | 国产在线观看福利片 | japan孕妇孕交freehd | 探花国产 | 超级碰碰青草免费视频92 | 国产清纯女高中生在线观看 | 男人的天堂视频 | 九九精品视频在线观看 | 欧美日韩免费一区二区在线观看 | 国产视频自拍一区 | 成人福利 | 美女被爆| 国产伦精一区二区三区视频 | 麻豆网站视频国产在线观看 | 美女狂揉尿口揉到失禁 | 日本最新伦中文字幕 | 91热这里只有精品 |