java中Serializable接口作用詳解
本文為大家解析java中Serializable接口的作用,具體內(nèi)容如下
1.(serializable)主要支持對象的回復(fù),所以可以用來保存當(dāng)前的程序系統(tǒng)狀態(tài),遠(yuǎn)程方法調(diào)用RMI(遠(yuǎn)程機(jī)器必須含有必要的.class文件,否則將擲出classNotFound Exception),但是因為它將對象數(shù)據(jù)自動全部保存,你根本無法插手,因此對于一些敏感字段(如:password)存在安全問題。但相應(yīng)有很多解決的方法,例如可以在敏感字段的聲明中使用transient關(guān)鍵字,或者去繼承externalizable接口,自己來實現(xiàn)readExternal()和writerExternal()方法,再或者繼承serializable接口,但提供private void writeObject(ObjectOutputStream s)等方法... ...但注意static 成員的保存仍需要你的介入。
2.1.網(wǎng)絡(luò)傳輸
2.數(shù)據(jù)庫持久
3.把對象保存為文件形式,以便以后還原
Object serialization的定義:
Object serialization 允許你將實現(xiàn)了Serializable接口的對象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲以備以后重新生成原來的對象。
serialization不但可以在本機(jī)做,而且可以經(jīng)由網(wǎng)絡(luò)操作(RMI)。這個好處是很大的----因為它自動屏蔽了操作系統(tǒng)的差異,字節(jié)順序(用Unix下的c開發(fā)過網(wǎng)絡(luò)編程的人應(yīng)該知道這個概念)等。比如,在Window平臺生成一個對象并序列化之,然后通過網(wǎng)絡(luò)傳到一臺Unix機(jī)器上,然后可以在這臺Unix機(jī)器上正確地重構(gòu)這個對象。
Object serialization主要用來支持2種主要的特性:
1、Java的RMI(remote method invocation).RMI允許象在本機(jī)上一樣操作遠(yuǎn)程機(jī)器上的對象。當(dāng)發(fā)送消息給遠(yuǎn)程對象時,就需要用到serializaiton機(jī)制來發(fā)送參數(shù)和接收返回直。
2、Java的JavaBeans. Bean的狀態(tài)信息通常是在設(shè)計時配置的。Bean的狀態(tài)信息必須被存起來,以便當(dāng)程序運(yùn)行時能恢復(fù)這些狀態(tài)信息。這也需要serializaiton機(jī)制。
二、sakulagi和rollingpig說的持久化我也說一下。
我覺得你們說的應(yīng)該是英文里的persistence.但是Java語言里現(xiàn)在只支持lightweight persistence,就是輕量級持久化,這是通過serialization機(jī)制來實現(xiàn)的。
persistence是指一個對象的生命周期不由程序是否執(zhí)行來決定,即使是在程序終止時這個對象也存在。它把一個serializable的對象寫到磁盤(本機(jī)或其他機(jī)器上的非RAM存儲器),并在程序重新調(diào)用時再讀取對象到通常的RAM存儲器。
為什么說Java的serialization機(jī)制實現(xiàn)的是lightweight persistence?因為你必須顯式的序列化和反序列化程序里的對象;而不是直接由一個關(guān)鍵詞來定義一個對象是序列化的然后由系統(tǒng)做相應(yīng)的處理。
下面是關(guān)于序列化的一個實例:
程序名稱:SerializationDemo.java
程序主題:實現(xiàn)對象的序列化和反序列化
程序說明:該程序由實例化一個MyClass類的對象開始,該對象有三個實例變量,類型分別為String、int、double,是希望存儲和恢復(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的實例變量是一樣的,輸出如下:[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 要更改此生成的類型注釋的模板,請轉(zhuǎn)至
* 窗口 - 首選項 - 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 自動生成 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);//打印結(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é)議。
要使類的實例實現(xiàn)序列化,只要在它的聲明中加入implements
java.io.Serializable
但是卻由一些隱患
1.實現(xiàn)了序列化后,一旦發(fā)布,講削弱改變類實現(xiàn)的靈活性。
2.增加了bug和安全漏洞的的可能性
3.當(dāng)你的新版本發(fā)布時增加了相關(guān)的測試上的問題。
類應(yīng)盡可能少的實現(xiàn)Serializable,接口也應(yīng)該少去擴(kuò)展它。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot對Druid配置SQL監(jiān)控功能失效問題及解決方法
這篇文章主要介紹了SpringBoot對Druid配置SQL監(jiān)控功能失效問題的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05
徹底解決java.lang.ClassNotFoundException: com.mysql.jdbc.Dr
這篇文章給大家介紹了如如何徹底解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題,文中有詳細(xì)的解決思路以及解決方法,需要的朋友可以參考下2023-11-11
關(guān)于java.math.BigDecimal比較大小問題
這篇文章主要介紹了關(guān)于java.math.BigDecimal比較大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Java并發(fā)工具之CyclicBarrier使用詳解
這篇文章主要介紹了Java并發(fā)工具之CyclicBarrier使用詳解,CyclicBarrier是一個同步器,允許一組線程相互之間等待,直到到達(dá)某個公共屏障點(common barrier point),再繼續(xù)執(zhí)行,需要的朋友可以參考下2023-12-12

