• java序列化Serializable那些事


     串行化也叫序列化,就是将实例的状态转化成文本(或二近制)的形式,以便永久保存(所以有时候也叫持久化,或者信息的冷藏等等)或在网间传递.也就是说,如果一个类的实例需要持久化或者需要在网间传递的时候,就用到了串行化 
            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; 
  • 相关阅读:
    Sql ISNULL() 函数
    C#WinForm中按钮响应回车事件的简单方法
    职场升迁全攻略 人脉资源是铺垫
    怎样成为有钱人
    睡前应做六件事
    赚钱的秘诀(转)
    将Win2003转换成个人PC版系统
    抠图神器Inpaint 4.2
    iPhone升级记:从4.3.3到5.0.1:越狱篇
    iPhone升级记:从4.3.3到5.0.1:弯路篇
  • 原文地址:https://www.cnblogs.com/beantestng/p/3767897.html
Copyright © 2020-2023  润新知