`

为什么序列化

 
阅读更多

转载

http://xiebh.iteye.com/blog/121311

 

1、序列化是干什么的?
       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

2、什么情况下需要序列化   
    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

3、当对一个对象实现序列化时,究竟发生了什么?
    在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
   

java 代码
  1. Foo  myFoo = new Foo();  
  2. myFoo .setWidth(37);  
  3. myFoo.setHeight(70);  

      
       当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。

java 代码
  1. FileOutputStream fs = new FileOutputStream("foo.ser");  
  2. ObjectOutputStream os = new ObjectOutputStream(fs);  
  3. os.writeObject(myFoo);  


4、实现序列化(保存到一个文件)的步骤
       
a)Make a FileOutputStream            

java 代码
  1. FileOutputStream fs = new FileOutputStream("foo.ser");    

       b)Make a ObjectOutputStream            

java 代码
  1. ObjectOutputStream os =  new ObjectOutputStream(fs);   

       c)write the object

java 代码
  1. os.writeObject(myObject1);  
  2. os.writeObject(myObject2);  
  3. os.writeObject(myObject3);  

    d) close the ObjectOutputStream

java 代码
  1. os.close();  



5、举例说明

java 代码
  1. import java.io.*;
  2.   
  3. public class  Box implements Serializable  
  4. {  
  5.     private int width;  
  6.     private int height;  
  7.   
  8.     public void setWidth(int width){  
  9.         this.width  = width;  
  10.     }  
  11.     public void setHeight(int height){  
  12.         this.height = height;  
  13.     }  
  14.   
  15.     public static void main(String[] args){  
  16.         Box myBox = new Box();  
  17.         myBox.setWidth(50);  
  18.         myBox.setHeight(30);  
  19.   
  20.         try{  
  21.             FileOutputStream fs = new FileOutputStream("foo.ser");  
  22.             ObjectOutputStream os =  new ObjectOutputStream(fs);  
  23.             os.writeObject(myBox);  
  24.             os.close();  
  25.         }catch(Exception ex){  
  26.             ex.printStackTrace();  
  27.         }  
  28.     }  
  29.       
  30. }  


6、相关注意事项
    a)序列化时,只对对象的状态进行保存,而不管对象的方法;
    b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
    c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
    d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
        1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输  等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
       2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分  配,而且,也是没有必要这样实现。

分享到:
评论

相关推荐

    C#序列化与反序列化(包括复杂xml对象)

    C# xml序列化及反序列化(解析xml为对象及对象转xml保存),方法一反序列化取节点KV值,方法二反序列化取节点标签值,方法三取节点KV值,并增加节点对象数组及节点标签组合反序列化

    java serializable 序列化与反序列化

    java 的序列化与反序列化举例测试

    Json序列化与反序列化方法封装类

    /// 序列化模型对象为Json /// /// 模型类型 /// 模型对象 /// <returns></returns> public static string GetJson(T model) where T : new() { return new JavaScriptSerializer().Serialize(model); } ...

    Dictionary序列化源码 datatable序列化源码

    Dictionary序列化源码 datatable序列化源码 文件反序列化为泛型数组 序列化泛型数组为xml文件 值得下载 源码可以运行

    C#中二进制数组转换,二进制序列化和json序列化方法

    C#中二进制数组h和各种常规数组的转换,二进制序列化和json序列化方法以及对应的反序列化方法的例子,帮助初学者。

    XML序列化与反序列化整理文档(12套)

    XML序列化与反序列化整理文档(12套) (附xml转化为序列化代码工具XML 2 Class) (附XML序列化的实例原代码)

    C#中以PLCOpen为例子的XML序列化,反序列化的代码

    此例子先用VS生成基于PLCOpen的XSD生成对应的类,然后利用序列化和反序列化的方式写入读取XML文件

    海尔2307户户通直播星序列化工具.zip

    海尔2307户户通直播星序列化工具为工厂维修机器使用使用场景:(1)更换flash需要重新进行序列化, 更改stbid或保留stbid不变1.本工具不需要连接工厂数据库,而是直接从HIC2307_NDSCA_xxxxxxxx_xxxxxxxx.dat文件里...

    XmlDemoTranfer Xml序列化与反序列化

    C#Xml序列化与反序列化,适用于与第三方系统做接口,入参和出参为XML,XML自动转实体,实体自动转Xml

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

    Person 类有两个属性:name 和 age,其中 age 属性被标记为 transient,表示不参与序列化。我们创建了一个 Person 对象,并将其序列化到文件 person.ser 中。然后,我们从文件中反序列化对象,并打印反序列化后的...

    delphi 序列化

    序列化 (serialization):将对象的状态信息转换为可以存储或传输的形式的过程。 与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 序列化的目的  1、以某种存储形式使...

    序列化示例代码

    此示例代码为:将实体类序列化Json和binary格式的数据

    Java实验7 序列化.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    .NET对象序列化与数据持久化

    .NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化(Q群号:152088818 本群只为有经验的.NET开发者...

    Java对象序列化标准最新版

    这是Java序列化标准规范,对于研究序列化源码能够提供指导作用,为深入研究Java序列技术奠定基础。

    java序列化并转化为16进制存储

    java序列化与反序列化,且支持转化为16进制存储,一个简单的例子

    窗体序列化与反序列化.rar

    窗体序列化与反序列化组件DEMO代码,将窗体序列化后保存为文件,下次打开还原窗体原貌,适用于窗体布局记忆功能的实现

    asp 序列化与反射

    帮助你更好的了解反射和序列化的原理 不为别的,只为帮助你们更好的学习

    C# 自定义工程文件-窗口值传递-序列化

    (5)如果Form2的两个文本框中分别为保存的两个整数,则说明序列化、反序列化都成功了。 可以参考我博客的两篇文章 序列化:http://blog.csdn.net/jiutao_tang/archive/2011/06/18/6554016.aspx 窗体间变量的值传递...

    SqlXml序列化到sql

    序列化是将对象转换为字节流以将其保存在内存、数据库或者磁盘文件中的过程,其主要目的是保存对象的状态,以便可以在需要时重新创建对象,将存放在内存、数据库、磁盘文件中的字节流转换为对象的过程即为反序列化的...

Global site tag (gtag.js) - Google Analytics