最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Serializable接口作用詳解

 更新時(shí)間:2017年05月15日 11:10:04   作者:doymm2008  
這篇文章主要為大家詳細(xì)介紹了java中Serializable接口作用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文為大家解析java中Serializable接口的作用,具體內(nèi)容如下

 1.(serializable)主要支持對(duì)象的回復(fù),所以可以用來保存當(dāng)前的程序系統(tǒng)狀態(tài),遠(yuǎn)程方法調(diào)用RMI(遠(yuǎn)程機(jī)器必須含有必要的.class文件,否則將擲出classNotFound   Exception),但是因?yàn)樗鼘?duì)象數(shù)據(jù)自動(dòng)全部保存,你根本無法插手,因此對(duì)于一些敏感字段(如: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.把對(duì)象保存為文件形式,以便以后還原 

Object serialization的定義:

Object serialization 允許你將實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲(chǔ)以備以后重新生成原來的對(duì)象。

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平臺(tái)生成一個(gè)對(duì)象并序列化之,然后通過網(wǎng)絡(luò)傳到一臺(tái)Unix機(jī)器上,然后可以在這臺(tái)Unix機(jī)器上正確地重構(gòu)這個(gè)對(duì)象。

Object serialization主要用來支持2種主要的特性:
1、Java的RMI(remote method invocation).RMI允許象在本機(jī)上一樣操作遠(yuǎn)程機(jī)器上的對(duì)象。當(dāng)發(fā)送消息給遠(yuǎn)程對(duì)象時(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,就是輕量級(jí)持久化,這是通過serialization機(jī)制來實(shí)現(xiàn)的。

persistence是指一個(gè)對(duì)象的生命周期不由程序是否執(zhí)行來決定,即使是在程序終止時(shí)這個(gè)對(duì)象也存在。它把一個(gè)serializable的對(duì)象寫到磁盤(本機(jī)或其他機(jī)器上的非RAM存儲(chǔ)器),并在程序重新調(diào)用時(shí)再讀取對(duì)象到通常的RAM存儲(chǔ)器。

為什么說Java的serialization機(jī)制實(shí)現(xiàn)的是lightweight persistence?因?yàn)槟惚仨氾@式的序列化和反序列化程序里的對(duì)象;而不是直接由一個(gè)關(guān)鍵詞來定義一個(gè)對(duì)象是序列化的然后由系統(tǒng)做相應(yīng)的處理。

下面是關(guān)于序列化的一個(gè)實(shí)例:

程序名稱:SerializationDemo.java
程序主題:實(shí)現(xiàn)對(duì)象的序列化和反序列化
程序說明:該程序由實(shí)例化一個(gè)MyClass類的對(duì)象開始,該對(duì)象有三個(gè)實(shí)例變量,類型分別為String、int、double,是希望存儲(chǔ)和恢復(fù)的信息。

代碼內(nèi)容

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è)小例子:

 import java.io.ObjectInputStream; 
 import java.io.ObjectOutputStream; 
 import java.io.Serializable; 
 
 /** 
 * @author Yan Chenyang 
 * 
 * TODO 要更改此生成的類型注釋的模板,請(qǐng)轉(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(); 
       } 
     }     
 } 
 }

序列化 用在 對(duì)象編碼成字節(jié)流及從字節(jié)流編碼重構(gòu)對(duì)象。   
序列化 為遠(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)的測(cè)試上的問題。   

類應(yīng)盡可能少的實(shí)現(xiàn)Serializable,接口也應(yīng)該少去擴(kuò)展它。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何實(shí)現(xiàn)nohup?java進(jìn)程號(hào)一直在變方法步驟詳解

    如何實(shí)現(xiàn)nohup?java進(jìn)程號(hào)一直在變方法步驟詳解

    這篇文章主要為大家介紹了如何實(shí)現(xiàn)nohup?java進(jìn)程號(hào)一直在變方法步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    在Java開發(fā)中,通常會(huì)采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細(xì)給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下
    2023-05-05
  • SpringBoot外部化配置示例解析

    SpringBoot外部化配置示例解析

    這篇文章主要介紹了SpringBoot外部化配置示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法

    Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法

    這篇文章主要介紹了Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 使用spring工廠讀取property配置文件示例代碼

    使用spring工廠讀取property配置文件示例代碼

    這篇文章主要介紹了使用spring工廠讀取property配置文件示例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • springboot中如何使用@Async方法

    springboot中如何使用@Async方法

    這篇文章主要介紹了springboot中如何使用@Async方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • feign 調(diào)用第三方服務(wù)中部分特殊符號(hào)未轉(zhuǎn)義問題

    feign 調(diào)用第三方服務(wù)中部分特殊符號(hào)未轉(zhuǎn)義問題

    這篇文章主要介紹了feign 調(diào)用第三方服務(wù)中部分特殊符號(hào)未轉(zhuǎn)義問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java synchronized輕量級(jí)鎖的核心原理詳解

    Java synchronized輕量級(jí)鎖的核心原理詳解

    這篇文章主要為大家詳細(xì)介紹了Java synchronized輕量級(jí)鎖的核心原理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java中Collections.sort()排序方法舉例詳解

    Java中Collections.sort()排序方法舉例詳解

    很多時(shí)候都需要對(duì)一些數(shù)據(jù)進(jìn)行排序的操作,這篇文章主要給大家介紹了關(guān)于Java中Collections.sort()方法舉例詳解的相關(guān)資料,使用Collections.sort()可以使用其sort()方法來對(duì)List、Set等集合進(jìn)行排序,需要的朋友可以參考下
    2024-02-02
  • 基于java配置nginx獲取真實(shí)IP代碼實(shí)例

    基于java配置nginx獲取真實(shí)IP代碼實(shí)例

    這篇文章主要介紹了基于java配置nginx獲取真實(shí)IP代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

时尚| 沾化县| 饶阳县| 桂林市| 邛崃市| 牟定县| 澜沧| 台中市| 大城县| 临夏县| 河津市| 宽城| 台东县| 渭南市| 岳池县| 黄梅县| 德州市| 岢岚县| 临潭县| 连江县| 松溪县| 昔阳县| 那坡县| 瑞金市| 平遥县| 梁山县| 阿合奇县| 温宿县| 罗江县| 文安县| 汉川市| 介休市| 盐亭县| 颍上县| 简阳市| 乌兰察布市| 岳池县| 松桃| 兰考县| 文山县| 固始县|