`
youyu4
  • 浏览: 424001 次
社区版块
存档分类
最新评论

Serializable接口的作用

    博客分类:
  • java
 
阅读更多

实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。

  序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。允许非序列化类的子类型序列化,子类型可以假定负责保存和恢复父类型的公有的、保护的和(如果可访问)包的域的状态。只要该类(扩展)有一个无参构造子,可初始化它的状态,那么子类型就可承担上述职责。在这种情况下申明一个可序列化的类是一个错误。此错误将在运行时被检测。就是可以把对象存到字节流,然后可以恢复!

  例如:Integer实现了Serializable,所以可以把一个Integer的对象用IO写到文件里,之后再可以从文件里读出,如你开始写入的时候那个对象的intValue() 是5的话,那读出来之后也是5。这一点体现了用序化类的作用,即用来传送类的对象。

 

  所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。

 

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,是希望存储和恢复的信息。

 

代码内容

package com.youyu4;
import java.io.*;

public class SerializationDemo{

	public static void main(String args[]){

		try{
			MyClass object1 = new MyClass("Hello",-7,2.7e10);
			System.out.println("object1:"+object1);
			FileOutputStream fos = new FileOutputStream(new File("D:/data/test.txt"));
			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("D:/data/test.txt");
			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);
		}
	}
}

 

package com.youyu4;

import java.io.Serializable;

class MyClass implements Serializable{
	
	private static final long serialVersionUID = 1514438142413262924L;
	
	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的实例变量是一样的,输出如下:

object1:s=Hello;i=-7;d=2.7E10 

object2:s=Hello;i=-7;d=2.7E10

分享到:
评论

相关推荐

    java中Serializable接口作用详解

    主要为大家详细介绍了java中Serializable接口作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java对象Serializable接口实现详解

    主要介绍了Java对象Serializable接口实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    android Activity之间数据传递 Parcelable和Serializable接口的使用

    android Activity之间数据传递 Parcelable和Serializable接口的使用的具体实例代码,详情请看>http://blog.csdn.net/js931178805/article/details/8268144

    可序列化接口Serializable

    NULL 博文链接:https://tony-lee-s.iteye.com/blog/1416044

    Serializable接口的作用_动力节点Java学院整理

    主要为大家详细介绍了java中Serializable接口的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Android面试专题(七):Serializable 和 Parcelable 的区别

    面试官:“说一下Serializable接口和Parcelable接口的区别吧。” 我们可以从以下两方面来说一说~ 首先我们先给两者来个简单的介绍: 1.定义 Serializable(Java自带): Serializable是序列化的意思,表示将一个对象...

    PHP自定义序列化接口Serializable用法分析

    主要介绍了PHP自定义序列化接口Serializable用法,结合实例形式分析了Serializable自定义序列化接口的概念、功能、定义及使用方法,需要的朋友可以参考下

    深入探索Java对象的序列化

    要序列化的对象应该实现Serializable接口。 Serializable接口是一个标识接口,没有抽象方法。 Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 ...

    解析Android中的Serializable序列化

    1、为何要序列化? — 把内存中的java对象能够在磁盘上持久保存 — 通过网络传输对象 — 通过RMI(Remote Method Invocation 远程过程调用)传输。 通过序列化可以把对象...Serializable接口是一种标记接口,用来标明

    Java 对象序列化详解以及实例实现和源码下载

    一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持 3 性能略差 实现...

    Intent传递对象之Serializable和Parcelable的区别

    Intent在不同的组件中传递对象数据的应用非常普遍,大家都知道在intent传递对象的方法有两种:1、实现Serializable接口、2、实现Parcelable接口。 Android中Intent传递对象的两种方法Serializable,Parcelable请点击...

    Android中Intent传递对象的两种方法(Serializable,Parcelable)

    Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);...当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口。

    Java_serialization_doc.rar_Serializable _doc_序列化

    Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络...

    Hibernate注解映射联合主键

    第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并...

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    代码中,我们定义了一个 Person 类,并实现了 Serializable 接口。Person 类有两个属性:name 和 age,其中 age 属性被标记为 transient,表示不参与序列化。我们创建了一个 Person 对象,并将其序列化到文件 person...

    Android参数传递方法汇总

    参见 http://blog.csdn.net/xcl168 Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把... 其中Parcelable接口 Serializable接口 Singleton模式 Bundle方式各有一个代表性的例子。

    java序列化深度探讨

    对象序列化就是把对象写入到输出流中,用来存储或者传输。 对象的反序列化就是从输入流中读取对象。... 要序列化的对象应该实现Serializable接口。 Serializable接口是一个标识接口,没有抽象方法。

    Java集合面试题.docx

    为何 Collection 不从 Cloneable 和 Serializable 接口继承? 5. 为何 Map 接口不继承 Collection 接口? 6. Iterator 是什么? 7. Enumeration 和 Iterator 接口的区别? 8. 为何没有像 Iterator.add()这样的...

    Java中的序列化与反序列化.pdf

    Serializable接口和Externalizable接口实现序列化和反序列化

Global site tag (gtag.js) - Google Analytics