`

为什么序列化

 
阅读更多

转载

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++ JSON 序列化与反序列化

    序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、jsoncpp等。以nlohmann/json为例,它的使用非常直观: 1. 引入库: ```cpp #...

    java 对象的序列化与反序列化

    首先,我们来解释一下什么是序列化。在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到磁盘上,或者通过网络进行传输。要实现一个对象的序列化,该对象的类必须实现`...

    C#和Java的序列化反序列化

    首先,我们要了解什么是序列化。序列化是指将对象的状态转化为可存储或可传输的数据格式的过程。这个过程通常将内存中的对象转换成字节流,以便保存到磁盘、数据库或者通过网络进行传输。在C#中,我们可以使用.NET...

    基于boost的序列化与反序列化

    在编程领域,序列化和反序列化是两个关键的概念,它们用于将对象的状态转换为可存储或可传输的格式,然后在需要时恢复为原始对象。Boost库提供了一个强大的工具——Boost.Serialization,来帮助程序员实现这个功能。...

    序列化和反序列化的封装类

    首先,我们需要理解什么是序列化。序列化是将一个对象的状态转换为可以存储或传输的形式,通常是XML、JSON或二进制格式。这样做的好处在于,我们可以保存对象的状态并在稍后恢复,或者将对象发送到远程服务器。在C#...

    XML序列化与反序列化 实战

    XML序列化与反序列化是.NET框架中处理数据交换的重要技术,它允许我们将对象的状态转换为XML格式的数据,也可以将XML数据恢复为等效的对象。这个实战项目专注于使用C#实现这一过程,使得开发者能够方便地在XML文件和...

    java序列化和反序列化的方法

    Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...

    hessian学习基础篇——序列化和反序列化

    首先,让我们理解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Java中,如果一个类实现了Serializable接口,那么该类的对象就可以被序列化。序列化的目的是为了保存对象的状态以便后续...

    序列化和反序列化dll文件和proto

    序列化DLL文件通常涉及将内存中的函数、变量和类结构转换为二进制流或XML等文本格式,以便在磁盘上保存或通过网络发送。反序列化则是将这个流恢复为原来的函数和数据结构,使其能够在应用程序中正常工作。 接下来,...

    java序列化(Serializable)的作用和反序列化.doc

    序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化保存对象的状态以及在不同系统间传输这些对象。 在Java中,通过实现`...

    java serializable 序列化与反序列化

    1. **什么是反序列化**:反序列化是将序列化的字节流恢复为原来的对象状态的过程。 2. **如何实现反序列化**:使用`ObjectInputStream`的`readObject()`方法从流中读取对象: ```java try (ObjectInputStream ois...

    hashtable序列化与反序列化

    首先,让我们理解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Java中,对象序列化允许我们将一个对象转换为字节流,这样就可以保存到磁盘、发送到网络或者存储在数据库中。`HashTable`...

    序列化与反序列化

    在标签"序列化"中,我们可以理解为该示例不仅关注JSON,也可能涉及其他序列化格式,如XML、protobuf等。这些格式各有优缺点,适用于不同的应用场景。XML提供更丰富的结构,适合描述复杂的文档,而protobuf则以更高的...

    protobuf序列化和反序列化技术

    谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据序列化协议,它能将结构化的数据序列化成字节流,方便在网络中进行高效、可靠的传输,同时也能将这些字节流还原为原来的结构化数据...

    delphi序列化与反序列化

    序列化是指将一个对象的状态转换为可以存储或传输的数据格式的过程。这通常是一个二进制流或者XML、JSON等文本格式。在Delphi中,我们可以通过实现`TStream`接口或者使用特定的序列化库来实现这一功能。序列化的目的...

    json数据序列化和反序列化

    2. 数据序列化:序列化是将对象转换为可传输或存储的格式,对于JSON,这意味着将JavaScript对象转换为JSON字符串。在JavaScript中,我们可以使用`JSON.stringify()`方法实现这一过程。例如: ```javascript let obj ...

    序列化反序列化例题net

    反序列化则是序列化的逆过程,它将已序列化的数据恢复为原来的对象状态。这使得我们能够在程序的不同阶段或不同环境中重新创建对象,保持其原始状态。 以下是几种常见的.NET序列化方法及其特点: 1. **...

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

    本文将深入探讨C#中的XML序列化和反序列化技术,包括如何将XML文档解析为对象,以及如何将对象转换回XML文档进行存储。我们将详细讲解三种方法,涵盖从XML节点获取键值对(KV值)到处理对象数组和节点标签组合的反...

    Json反序列化

    二、为什么要进行JSON反序列化? 1. 提高效率:直接操作反序列化后的对象比解析JSON字符串更高效,避免了逐字符解析和构建数据结构的时间消耗。 2. 易于使用:反序列化后的数据可以直接与编程语言的内置类型交互,...

    学生管理系统(序列化和反序列化)

    序列化和反序列化是这个系统的关键技术,它们允许程序将对象的状态转化为可存储或传输的形式,然后在需要时还原为原来的对象。以下是对这两个概念的详细解释以及在学生管理系统中的应用。 1. **序列化**:序列化是...

Global site tag (gtag.js) - Google Analytics