您好,登錄后才能下訂單哦!
本文為大家解析java中Serializable接口的作用,具體內容如下
1.(serializable)主要支持對象的回復,所以可以用來保存當前的程序系統狀態,遠程方法調用RMI(遠程機器必須含有必要的.class文件,否則將擲出classNotFound Exception),但是因為它將對象數據自動全部保存,你根本無法插手,因此對于一些敏感字段(如:password)存在安全問題。但相應有很多解決的方法,例如可以在敏感字段的聲明中使用transient關鍵字,或者去繼承externalizable接口,自己來實現readExternal()和writerExternal()方法,再或者繼承serializable接口,但提供private void writeObject(ObjectOutputStream s)等方法... ...但注意static 成員的保存仍需要你的介入。
2.1.網絡傳輸
2.數據庫持久
3.把對象保存為文件形式,以便以后還原
Object serialization的定義:
Object serialization 允許你將實現了Serializable接口的對象轉換為字節序列,這些字節序列可以被完全存儲以備以后重新生成原來的對象。
serialization不但可以在本機做,而且可以經由網絡操作(RMI)。這個好處是很大的----因為它自動屏蔽了操作系統的差異,字節順序(用Unix下的c開發過網絡編程的人應該知道這個概念)等。比如,在Window平臺生成一個對象并序列化之,然后通過網絡傳到一臺Unix機器上,然后可以在這臺Unix機器上正確地重構這個對象。
Object serialization主要用來支持2種主要的特性:
1、Java的RMI(remote method invocation).RMI允許象在本機上一樣操作遠程機器上的對象。當發送消息給遠程對象時,就需要用到serializaiton機制來發送參數和接收返回直。
2、Java的JavaBeans. Bean的狀態信息通常是在設計時配置的。Bean的狀態信息必須被存起來,以便當程序運行時能恢復這些狀態信息。這也需要serializaiton機制。
二、sakulagi和rollingpig說的持久化我也說一下。
我覺得你們說的應該是英文里的persistence.但是Java語言里現在只支持lightweight persistence,就是輕量級持久化,這是通過serialization機制來實現的。
persistence是指一個對象的生命周期不由程序是否執行來決定,即使是在程序終止時這個對象也存在。它把一個serializable的對象寫到磁盤(本機或其他機器上的非RAM存儲器),并在程序重新調用時再讀取對象到通常的RAM存儲器。
為什么說Java的serialization機制實現的是lightweight persistence?因為你必須顯式的序列化和反序列化程序里的對象;而不是直接由一個關鍵詞來定義一個對象是序列化的然后由系統做相應的處理。
下面是關于序列化的一個實例:
程序名稱:SerializationDemo.java
程序主題:實現對象的序列化和反序列化
程序說明:該程序由實例化一個MyClass類的對象開始,該對象有三個實例變量,類型分別為String、int、double,是希望存儲和恢復的信息。
代碼內容
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; } }
程序運行結果:object1和object2的實例變量是一樣的,輸出如下:[code:1:a55efb5f91]object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10
一個小例子:
import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * @author Yan Chenyang * * TODO 要更改此生成的類型注釋的模板,請轉至 * 窗口 - 首選項 - 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 要設置的 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 自動生成 catch 塊 e.printStackTrace(); } catch (FileNotFoundException e) { // TODO 自動生成 catch 塊 e.printStackTrace(); } catch (IOException e) { // TODO 自動生成 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);//打印結果 // }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(); } } } }
序列化 用在 對象編碼成字節流及從字節流編碼重構對象。
序列化 為遠程通信提供了標準的wire-level協議。
要使類的實例實現序列化,只要在它的聲明中加入implements
java.io.Serializable
但是卻由一些隱患
1.實現了序列化后,一旦發布,講削弱改變類實現的靈活性。
2.增加了bug和安全漏洞的的可能性
3.當你的新版本發布時增加了相關的測試上的問題。
類應盡可能少的實現Serializable,接口也應該少去擴展它。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。