本文為大家解析java中Serializable接口的作用,具體內(nèi)容如下
1.(serializable)主要支持對象的回復(fù),所以可以用來保存當(dāng)前的程序系統(tǒng)狀態(tài),遠(yuǎn)程方法調(diào)用RMI(遠(yuǎn)程機(jī)器必須含有必要的.class文件,否則將擲出classNotFound Exception),但是因?yàn)樗鼘ο髷?shù)據(jù)自動(dòng)全部保存,你根本無法插手,因此對于一些敏感字段(如:password)存在安全問題。但相應(yīng)有很多解決的方法,例如可以在敏感字段的聲明中使用transient關(guān)鍵字,或者去繼承externalizable接口,自己來實(shí)現(xiàn)readExternal()和writerExternal()方法,再或者繼承serializable接口,但提供private void writeObject(ObjectOutputStream s)等方法... ...但注意static 成員的保存仍需要你的介入。
2.1.網(wǎng)絡(luò)傳輸
2.數(shù)據(jù)庫持久
3.把對象保存為文件形式,以便以后還原
Object serialization的定義:
Object serialization 允許你將實(shí)現(xiàn)了Serializable接口的對象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲以備以后重新生成原來的對象。
serialization不但可以在本機(jī)做,而且可以經(jīng)由網(wǎng)絡(luò)操作(RMI)。這個(gè)好處是很大的----因?yàn)樗詣?dòng)屏蔽了操作系統(tǒng)的差異,字節(jié)順序(用Unix下的c開發(fā)過網(wǎng)絡(luò)編程的人應(yīng)該知道這個(gè)概念)等。比如,在Window平臺生成一個(gè)對象并序列化之,然后通過網(wǎng)絡(luò)傳到一臺Unix機(jī)器上,然后可以在這臺Unix機(jī)器上正確地重構(gòu)這個(gè)對象。
Object serialization主要用來支持2種主要的特性:
1、Java的RMI(remote method invocation).RMI允許象在本機(jī)上一樣操作遠(yuǎn)程機(jī)器上的對象。當(dāng)發(fā)送消息給遠(yuǎn)程對象時(shí),就需要用到serializaiton機(jī)制來發(fā)送參數(shù)和接收返回直。
2、Java的JavaBeans. Bean的狀態(tài)信息通常是在設(shè)計(jì)時(shí)配置的。Bean的狀態(tài)信息必須被存起來,以便當(dāng)程序運(yùn)行時(shí)能恢復(fù)這些狀態(tài)信息。這也需要serializaiton機(jī)制。
二、sakulagi和rollingpig說的持久化我也說一下。
我覺得你們說的應(yīng)該是英文里的persistence.但是Java語言里現(xiàn)在只支持lightweight persistence,就是輕量級持久化,這是通過serialization機(jī)制來實(shí)現(xiàn)的。
persistence是指一個(gè)對象的生命周期不由程序是否執(zhí)行來決定,即使是在程序終止時(shí)這個(gè)對象也存在。它把一個(gè)serializable的對象寫到磁盤(本機(jī)或其他機(jī)器上的非RAM存儲器),并在程序重新調(diào)用時(shí)再讀取對象到通常的RAM存儲器。
為什么說Java的serialization機(jī)制實(shí)現(xiàn)的是lightweight persistence?因?yàn)槟惚仨氾@式的序列化和反序列化程序里的對象;而不是直接由一個(gè)關(guān)鍵詞來定義一個(gè)對象是序列化的然后由系統(tǒng)做相應(yīng)的處理。
下面是關(guān)于序列化的一個(gè)實(shí)例:
程序名稱:SerializationDemo.java
程序主題:實(shí)現(xiàn)對象的序列化和反序列化
程序說明:該程序由實(shí)例化一個(gè)MyClass類的對象開始,該對象有三個(gè)實(shí)例變量,類型分別為String、int、double,是希望存儲和恢復(fù)的信息。
代碼內(nèi)容
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
|
import java.io.*; public class SerializationDemo{ public static void main(String args[]){ //Object serialization try { MyClass object1= new MyClass( "Hello" ,- 7 , 2 .7e10); System.out.println( "object1:" +object1); FileOutputStream fos= new FileOutputStream( "serial" ); ObjectOutputStream oos= new ObjectOutputStream(fos); oos.writeObject(object1); oos.flush(); oos.close(); } catch (Exception e){ System.out.println( "Exception during serialization:" +e); System.exit( 0 ); } //Object deserialization try { MyClass object2; FileInputStream fis= new FileInputStream( "serial" ); ObjectInputStream ois= new ObjectInputStream(fis); object2=(MyClass)ois.readObject(); ois.close(); System.out.println( "object2:" +object2); } catch (Exception e){ System.out.println( "Exception during deserialization:" +e); System.exit( 0 ); } } } class MyClass implements Serializable{ String s; int i; double d; public MyClass(String s, int i, double d){ this .s=s; this .i=i; this .d=d; } public String toString(){ return "s=" +s+ ";i=" +i+ ";d=" +d; } } |
程序運(yùn)行結(jié)果:object1和object2的實(shí)例變量是一樣的,輸出如下:[code:1:a55efb5f91]object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10
一個(gè)小例子:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * @author Yan Chenyang * * TODO 要更改此生成的類型注釋的模板,請轉(zhuǎn)至 * 窗口 - 首選項(xiàng) - Java - 代碼樣式 - 代碼模板 */ public class JFunction implements Serializable{ private double [][] bounds; private int vnum; private double result; private String funcname; public JFunction(){ super (); this .bounds= null ; this .vnum= 0 ; this .result= 0.0 ; this .funcname= null ; } public JFunction( double [][] bounds){ super (); this .bounds=bounds; this .vnum=bounds[ 0 ].length; this .result= 0.0 ; this .funcname= "Function 1" ; } public double Func( double [] var){ result= 0.0 ; for ( int i= 0 ;i<var.length;i++) result+=var[i]; return result; } public static JFunction deserialize(ObjectInputStream oin) throws Exception{ JFunction f=(JFunction)oin.readObject(); return f; } public void serialize(ObjectOutputStream oout) throws Exception{ oout.writeObject( this ); } public String toString(){ return funcname ; } /** * @return 返回 funcname。 */ public String getFuncname() { return funcname; } /** * @param funcname 要設(shè)置的 funcname。 */ public void setFuncname(String funcname) { this .funcname = funcname; } } public class JFunctionTest0 { public static void main(String[] args){ double [][] bounds={{- 2.048 ,- 2.048 },{ 2.048 , 2.048 }}; JFunction function= new JFunction(bounds); Interpreter interpreter= new Interpreter(); try { double [] x={ 2.15 , 1.00 }; interpreter.set( "var" ,x); interpreter.source( "c:/x.bsh" ); System.out.println(interpreter.get( "ret" )); } catch (EvalError e) { // TODO 自動(dòng)生成 catch 塊 e.printStackTrace(); } catch (FileNotFoundException e) { // TODO 自動(dòng)生成 catch 塊 e.printStackTrace(); } catch (IOException e) { // TODO 自動(dòng)生成 catch 塊 e.printStackTrace(); } FileInputStream in= null ; FileOutputStream out= null ; ObjectInputStream oin= null ; ObjectOutputStream oout= null ; try { out = new FileOutputStream( "function1.func" ); oout = new ObjectOutputStream(out); function.serialize(oout); //序列化 oout.close(); oout= null ; in = new FileInputStream( "function1.func" ); oin = new ObjectInputStream(in); JFunction tfunction =JFunction.deserialize(oin); //反序列化 double [] var={ 2.0 , 5.0 }; // System.out.println(tfunction.Func(var)); // System.out.println(tfunction);//打印結(jié)果 // } catch (Exception ex){ ex.printStackTrace(); } finally { try { if (in != null ) { in.close(); } if (oin != null ) { oin.close(); } if (out != null ) { out.close(); } if (oout != null ) { oout.close(); } } catch (IOException ex1) { ex1.printStackTrace(); } } } } |
序列化 用在 對象編碼成字節(jié)流及從字節(jié)流編碼重構(gòu)對象。
序列化 為遠(yuǎn)程通信提供了標(biāo)準(zhǔn)的wire-level協(xié)議。
要使類的實(shí)例實(shí)現(xiàn)序列化,只要在它的聲明中加入implements
java.io.Serializable
但是卻由一些隱患
1.實(shí)現(xiàn)了序列化后,一旦發(fā)布,講削弱改變類實(shí)現(xiàn)的靈活性。
2.增加了bug和安全漏洞的的可能性
3.當(dāng)你的新版本發(fā)布時(shí)增加了相關(guān)的測試上的問題。
類應(yīng)盡可能少的實(shí)現(xiàn)Serializable,接口也應(yīng)該少去擴(kuò)展它。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。