java之序列化Serialization 机制

转载 2016年06月01日 15:13:09

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

Java代码  收藏代码
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.ObjectInputStream;  
  5. import java.io.ObjectOutputStream;  
  6. import java.io.Serializable;  
  7.   
  8. public class Pair implements Serializable{  
  9.   
  10.     private static final long serialVersionUID = -1874850715617681161L;  
  11.     private int type;  
  12.     private String name;  
  13.       
  14.     public int getType() {  
  15.         return type;  
  16.     }  
  17.   
  18.     public void setType(int type) {  
  19.         this.type = type;  
  20.     }  
  21.   
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.   
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.   
  30.       
  31.     public Pair(int type, String name) {  
  32.         super();  
  33.         this.type = type;  
  34.         this.name = name;  
  35.     }  
  36.   
  37.     public static void main(String[] args) throws IOException, ClassNotFoundException {  
  38.         // TODO Auto-generated method stub  
  39.         //serialize object pair  
  40.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  41.         ObjectOutputStream oos = new ObjectOutputStream(bos);  
  42.         Pair pair = new Pair(1"charlie");  
  43.         oos.writeObject(pair);  
  44.         //deserialize object, get new object newpair  
  45.         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
  46.         ObjectInputStream ois = new ObjectInputStream(bis);  
  47.         Pair newpair = (Pair) ois.readObject();  
  48.           
  49.         System.out.println(newpair.getType()+":"+newpair.getName());  
  50.     }  
  51. }  


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: 
Java代码  收藏代码
  1. private void readObject(java.io.ObjectInputStream stream)  
  2.     throws IOException, ClassNotFoundException;  
  3. private void writeObject(java.io.ObjectOutputStream stream)  
  4.     throws IOException  
  5. private void readObjectNoData()   
  6.     throws ObjectStreamException;  

感谢http://zzy1943.iteye.com/blog/634418


22. Dubbo原理解析-编码解码之Serialization接口定义

序列化:dubbo提供了一系列的序列化反序列化对象工具。 Serialization接口定义 @SPI("hessian2") public interface Serialization {...
  • u010311445
  • u010311445
  • 2014年12月03日 20:36
  • 3756

C++Boost序列化(Serialization)库教程

一个非常简单的情形 非侵入的版本 可序列化的成员 派生类 指针 数组 STL容器 类的版本 把serialize拆分成save/load 档案 输出档案(archive)类似于输出数据流(stream...
  • fanyun_01
  • fanyun_01
  • 2016年09月30日 09:22
  • 1503

怎样用boost::serialization去序列化派生模板类

本篇是boost::serialization 用基类指针转存派生类(错误多多,一波三折)的姊妹篇,这里只不过做一个总结。 先来看一个基类 class base_class { public: ba...
  • yanziguilai
  • yanziguilai
  • 2014年05月03日 17:30
  • 1465

探讨和比较Java和.NET的序列化(Serialization)框架

  • 2016年08月09日 01:47
  • 303KB
  • 下载

怎样做才能让Java 序列化机制 更安全 ? Security principles we follow to make Java Serialization safe.

Java 序列化 serialization,大家应该都不陌生。其主要职责就是将一个对象的状态转化为一个字节序列,以方便对象的持久化或网络传输。反序列化的过程正好相反。开发人员所要做的只是实现Seri...
  • TechNerd
  • TechNerd
  • 2013年10月27日 23:29
  • 1879

Java对象序列化 Object Serialization

在最近的一次项目中,从服务器中请求得到了登录用户的相关信息,显然的,需要把其中的信息保存下来。在Android中,持久化保存信息的方式有很多种。比如数据库,首选项,又或者内部存储。但是,这个需要保存的...
  • learn2012
  • learn2012
  • 2016年08月20日 14:55
  • 342

浅析Java Object Serialization与 Hadoop 序列化

浅析Java Object Serialization与 Hadoop 序列化
  • yangjjuan
  • yangjjuan
  • 2017年06月12日 20:29
  • 1826

Java之一:Serialization(序列化…

本博文主要介绍Java Serialization(序列化)的定义、实现、特点、接口、算法和实例 Java序列化的定义:        Java Serialization(序列化)是将对象或...
  • sinat_16596967
  • sinat_16596967
  • 2014年07月19日 14:18
  • 531

JAVA之序列化(Serialization)的理解

目录[-] 1、什么是序列化 2、为什么叫序列化 3、序列化保存那些内容 3、序列化的用途 4、什么是流(Stream) 4、使用序列化功能 5、什么样的类可以序列化 6、进一步的内容...
  • lqhed
  • lqhed
  • 2016年06月01日 15:01
  • 339

Java Serialization 序列化

1、序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object ...
  • beiyeqingteng
  • beiyeqingteng
  • 2011年09月04日 05:28
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java之序列化Serialization 机制
举报原因:
原因补充:

(最多只允许输入30个字)