`
zzy1943
  • 浏览: 50588 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java的Serialization 机制

阅读更多
基本使用方法      
        Serialization是指把类或者基本的数据类型持久化(persistence)到数据流(Stream)中,包括文件、字节流、网络数据流。
         JAVA中实现serialization主要靠两个类:ObjectOuputStream和ObjectInputStream。他们是JAVA IO系统里的OutputStream和InputStream的子类。既然他们是JAVA IO中的流,那么就可以像操作一般的流一样来操作他们。下面是他们使用方法:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Pair implements Serializable{

	private static final long serialVersionUID = -1874850715617681161L;
	private int type;
	private String name;
	
	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	
	public Pair(int type, String name) {
		super();
		this.type = type;
		this.name = name;
	}

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		// TODO Auto-generated method stub
		//serialize object pair
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		Pair pair = new Pair(1, "charlie");
		oos.writeObject(pair);
		//deserialize object, get new object newpair
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis);
		Pair newpair = (Pair) ois.readObject();
		
		System.out.println(newpair.getType()+":"+newpair.getName());
	}
}



1. 这两个类都是decorator模式的,在创建他们的时候,都要传入一个基于字节的流,真正在底下存贮序列化数据的都是这些流。
2. 被持久化的类要实现Serializable接口,这个接口没有任何函数,只是一个标记接口。如果在一台机器上进行序列化,把得到的数据传送到另外一个机器上进行反序列化,那么这两台机器上的类应该是完全一样的,否则序列化是不会成功的。
3. 切记不要把上面代码中的bos用toString得到String,然后再从这个String中得到ByteArrayInputStream,再进行反序列化。bos是以字节存贮的,转成以字符存贮的String必然会造成数据的变化,而从String中到的byte[]也不会是之前那个byte[]了。我遇到过这个问题,是因为我想把序列化之后的数据存在xml文件中。这个问题的具体解决方法见我的另外一篇博客:http://zzy1943.iteye.com/blog/634553

java虚拟机在序列化和反序列化的时候都做了些什么?

javadoc中对这两个类的描述中对java的序列化机制进行了详细的描述:
引用

The default serialization mechanism for an object writes the class of the object, the class signature, and the values of all non-transient and non-static fields. References to other objects (except in transient or static fields) cause those objects to be written also. Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.

默认的序列化机制写到流中的数据有:
1、对象所属的类
2、类的签名
3、所有的非transient和非static的属性
4、对其他对象的引用也会造成对这些对象的序列化
5、如果多个引用指向一个对象,那么会使用sharing reference机制
引用

Classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:
 private void readObject(java.io.ObjectInputStream stream)
     throws IOException, ClassNotFoundException;
 private void writeObject(java.io.ObjectOutputStream stream)
     throws IOException
 private void readObjectNoData() 
     throws ObjectStreamException;

0
1
分享到:
评论

相关推荐

    Java序列化(Serialization) 机制

    本篇文章是对Java中对象的序列化(Serialization) 机制进行了详细的分析介绍,并附实例,需要的朋友可以参考下

    Java_serialization_doc.rar_Serializable _doc_序列化

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

    JAVA基础入门教程

    z Java异常处理机制 z Java基本类库介绍 z Java多线程编程 z Java I/O 流(character Stream, byte Stream, serialization) z Java Collections Framework z Java GUI(awt, swing, layoutManger, eventhandling….) z...

    Java序列化的机制和原理

    Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。……

    java高手必备知识点

    你需要学习Java语言的基础知识以及它的核心类库(collections、serialization、streams、networking、multithreading、reflection、event、handling、NIO、localization以及其他)。  3. 你应该了解JVM、class...

    java编程基础,应用与实例

    1.2.6 垃圾回收机制(garbage collection) 2 1.3 安装Java程序开发工具(JDK1.5) 2 1.3.1 安装JAVA 2 Standard Edition 1.5.0 3 1.3.2 安装开发文档及最终完成 5 1.3.3 Java开发工具 6 1.4 Java程序开发...

    Serialization:Java中的序列化

    序列化Java中的序列化序列化是一种将对象的状态转换为字节流的机制。 反序列化是相反的过程,其中字节流用于在内存中重新创建实际的Java对象。 该机制用于持久化对象。

    学习java的30个目标

    你需要学习JAVA语言的基础知识以及它的核心类库(collections,serialization,streams,networking, multithreading,reflection,event,handling,NIO,localization,以及其他)。  3.你应该了解JVM,class...

    Java序列化与反序列化三种格式存取

     Java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个...

    java笔试题算法-distributed-saga:分布式saga模式的实现由用于api、执行和序列化的单独java库组成

    这些库可用于构建具有明确定义的容错和恢复机制的分布式系统。 saga-samples 模块下的 polyglot-persistence 示例应用程序演示了所有分布式 saga 库的充分利用,是一个很好的起点。 该项目的一个目标是分布式 saga ...

    java_school_persistence:关于Java持久性的讲座

    Java持久性讲座 打包在这里: ...该项目是由Maven原型模板机制创建的。 可以通过命令来调用它: mvn archetype:generate 回答了一些问题后,您将获得适合Maven的项目结构。 测试项目 mvn test

    Netty编解码框架分析

    通常我们也习惯将编码(Encode)称为序列化(serialization),它将...1.2.1.Java序列化相信大多数Java程序员接触到的第一种序列化或者编解码技术就是Java默认提供的序列化机制,需要序列化的Java对象只需要实现java.i

    基于javatcpsocket通信的拆包和装包源码-myDistributedArchitecture:自定义分布式框架

    Serialization/Deserialization:负责对 RPC 调用通过网络传输的内容进行序列与反序列化,不同的 RPC 框架有不同的实现机制,主要分为文本与二进制两大类。文本类别的序列化机制主要有 XML 与 JSON 两种格式,二进制...

    fsw-demo:学习FSW的演示项目

    e 是一组用于 FSW PoC 意图的应用程序custom-soapfault : 生成自定义 fsw-switchyard-properties :如何在 SwitchYard 中使用属性的示例fsw- switchyard -serialization : SwitchYard 序列化机制的例子

    Spring.net框架

    t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本...Serialize Your Deck with Positron [XML Serialization, XSD, C#]...

Global site tag (gtag.js) - Google Analytics