全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java中Serializable接口作用详解

本文为大家解析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,接口也应该少去扩展它。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # Serializable  # 接口  # 关于Java实体类Serializable序列化接口的作用和必要性解析  # Java中EnvironmentAware 接口的作用  # Java编程接口调用的作用及代码分享  # Serializable接口的作用_动力节点Java学院整理  # Java接口的作用_动力节点Java学院整理  # Java接口的作用以及使用说明  # 关键词  # 序列化  # 是在  # 自动生成  # 机器上  # 本机  # 来实现  # 的人  # 重构  # 的是  # 增加了  # 这是  # 实现了  # 我觉得  # 有很多  # 是指  # 并在  # 一台  # 这也  # 英文 


相关文章: 一键网站制作软件,义乌购一件代发流程?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何在景安云服务器上绑定域名并配置虚拟主机?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  想学网站制作怎么学,建立一个网站要花费多少?  建站之星如何优化SEO以实现高效排名?  建站之星安装提示数据库无法连接如何解决?  如何用搬瓦工VPS快速搭建个人网站?  如何快速生成可下载的建站源码工具?  表情包在线制作网站免费,表情包怎么弄?  公司网站制作价格怎么算,公司办个官网需要多少钱?  学校为何禁止电信移动建设网站?  实例解析angularjs的filter过滤器  ,sp开头的版面叫什么?  网站制作报价单模板图片,小松挖机官方网站报价?  湖北网站制作公司有哪些,湖北清能集团官网?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  ,想在网上投简历,哪几个网站比较好?  定制建站方案优化指南:企业官网开发与建站费用解析  建站org新手必看:2024最新搭建流程与模板选择技巧  建站之星如何取消后台验证码生成?  学校建站服务器如何选型才能满足性能需求?  定制建站哪家更专业可靠?推荐榜单揭晓  ,购物网站怎么盈利呢?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  如何用y主机助手快速搭建网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  网站制作员失业,怎样查看自己网站的注册者?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  网站企业制作流程,用什么语言做企业网站比较好?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何快速启动建站代理加盟业务?  网站制作话术技巧,网站推广做的好怎么话术?  建站之星后台密码遗忘如何找回?  如何高效配置IIS服务器搭建网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  公司网站设计制作厂家,怎么创建自己的一个网站?  如何快速查询网址的建站时间与历史轨迹?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  javascript中的try catch异常捕获机制用法分析  建站主机服务器选购指南:轻量应用与VPS配置解析  如何确保FTP站点访问权限与数据传输安全?  如何选择适合PHP云建站的开源框架?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  建站之星如何快速生成多端适配网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。