`

序列化和反序列化

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

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

3、当对一个对象实现序列化时,究竟发生了什么?
    在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
  
java 代码
Foo  myFoo = new Foo(); 
myFoo .setWidth(37); 
myFoo.setHeight(70); 
     
       当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser"); 
ObjectOutputStream os = new ObjectOutputStream(fs); 
os.writeObject(myFoo); 

4、实现序列化(保存到一个文件)的步骤
       a)Make a FileOutputStream           
java 代码
FileOutputStream fs = new FileOutputStream("foo.ser");   
       b)Make a ObjectOutputStream           
java 代码
ObjectOutputStream os =  new ObjectOutputStream(fs);  
       c)write the object
java 代码
os.writeObject(myObject1); 
os.writeObject(myObject2); 
os.writeObject(myObject3); 
    d) close the ObjectOutputStream
java 代码
os.close(); 


5、举例说明
java 代码
import java.io.*;
 
public class  Box implements Serializable 

    private int width; 
    private int height; 
 
    public void setWidth(int width){ 
        this.width  = width; 
    } 
    public void setHeight(int height){ 
        this.height = height; 
    } 
 
    public static void main(String[] args){ 
        Box myBox = new Box(); 
        myBox.setWidth(50); 
        myBox.setHeight(30); 
 
        try{ 
            FileOutputStream fs = new FileOutputStream("foo.ser"); 
            ObjectOutputStream os =  new ObjectOutputStream(fs); 
            os.writeObject(myBox); 
            os.close(); 
        }catch(Exception ex){ 
            ex.printStackTrace(); 
        } 
    } 
     


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

相关推荐

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

    在编程领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络传输和对象持久化等场景中。它们允许我们将对象的状态转换为字节流(序列化),然后在需要的时候将字节流还原为原来的对象(反序列化)。在C#...

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

    在IT领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络通信和分布式系统中。它们涉及将对象的状态转换为可持久化的格式(序列化),以及将这种格式还原回原来的对象(反序列化)。本文将深入探讨这两...

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

    在IT领域,序列化和反序列化是两个关键的概念,特别是在网络通信、数据持久化以及对象存储中。本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过...

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

    在本项目中,“学生管理系统(序列化和反序列化)”是一个基于Java或类似编程语言实现的系统,其核心功能是有效地存储和恢复学生信息。序列化和反序列化是这个系统的关键技术,它们允许程序将对象的状态转化为可存储...

    protobuf序列化和反序列化技术

    protobuf序列化和反序列化技术是大数据处理领域中不可或缺的一部分,尤其在实时大数据场景下,高效的数据传输和存储对性能有着直接影响。谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据...

    用Javascript将form所有内容序列化和反序列化的例子。

    本文将深入探讨如何使用JavaScript对表单数据进行序列化和反序列化。 序列化是将数据结构或对象转换为字符串的过程,便于存储或传输。在HTML表单中,序列化通常是指将表单元素的值转换为URL编码的字符串,以便通过...

    json数据序列化和反序列化

    在IT领域,JSON数据序列化和反序列化是数据处理的重要环节,尤其在Web开发中,它们在客户端与服务器之间传递数据时起到关键作用。 1. JSON数据格式:JSON数据由键值对组成,键用引号包围,然后冒号分隔,接着是值。...

    Java对象序列化和反序列化工具Xson.zip

    Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven:  <groupId>com.github.xsonorg</groupId>  <artifactId>xson-core  <version>1.0.1 ...

    java序列化和反序列化

    - 实现此接口后,Java虚拟机就能够自动进行序列化和反序列化操作。 2. **序列化过程:** - 创建一个`java.io.ObjectOutputStream`实例。 - 使用`ObjectOutputStream`的`writeObject()`方法将对象写出到输出流中...

    C# 各种序列化和反序列化

    在编程世界中,序列化和反序列化是两个至关重要的概念,尤其是在C#这样的面向对象的语言中。它们允许我们将对象的状态转换为数据流,以便存储或传输,然后将这些数据流还原为原来的对象形式。本篇文章将深入探讨C#中...

    .net 序列化和反序列化 Json

    .NET框架中的序列化和反序列化是数据转换的重要部分,特别是在与JSON格式交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,被广泛应用于...

    序列化和反序列化(文本加密成二进制文件)

    在IT领域,序列化和反序列化是两个关键概念,主要应用于数据持久化、网络通信以及对象存储等场景。序列化是指将一个对象的状态转换为可存储或传输的形式,通常是二进制流;反序列化则相反,是将这个二进制流恢复为...

    Java对象的序列化和反序列化实践

    在Java编程语言中,对象的序列化和反序列化是两个关键的概念,它们允许我们将对象的状态转换为可存储或传输的格式,然后再恢复为原始对象。这个过程对于数据持久化、网络传输以及跨进程通信等场景非常有用。下面将...

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

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

    ASPNET中JSON的序列化和反序列化的方法

    在***中处理JSON的序列化和反序列化是Web开发中常见的需求。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由于其简洁性和易于阅读性,被广泛用于服务器与客户端之间的数据传输。下面将详细介绍**...

    C++ JSON 序列化与反序列化

    1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator>>`,或者使用nlohmann/json库中的`to_json`和`from_...

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

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    jackson json序列化,反序列化所需jar包

    Jackson是Java领域中广泛使用的JSON处理库,它提供了高效的JSON序列化和反序列化功能。在Java应用程序中,我们经常需要将Java对象转换为JSON字符串(序列化)或从JSON字符串恢复Java对象(反序列化),Jackson库就是...

Global site tag (gtag.js) - Google Analytics