`
chenqqabcd
  • 浏览: 5433 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

2.对象的串行化(Serialization)和反串行化(deserialization)

 
阅读更多
引用
串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,打回原形。
一、串行化的意义:
1:解决Web应用程序的无状态弊端
一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中—— 只要是可以存储的任何地方。需要恢复对象时,仅仅只需从它存储的位置反串行化即可。对象固有的这种特性对于无状态的Web应用程序是非常重要的,因为它允许重要的状态信息可以在用户请求之间保留。
2:应用程序边界之间传递对象
串行化也允许对象在应用程序边界之间传递,编程人员可以将描述对象状态的字节流在网络上传递,并在另一端反串行化成一个匹配的对象。从本质上讲,串行化允许对象以“数值”的方式传递给另一个应用程序。
二:串行化对象
在java中串行化对象必须:
1、该对象的类必须实现Serializable接口
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。
注:保存任何的成员方法和静态的成员变量没有任何的意义,因为,对象的类已经完整的保存了他们,如果再串行化他们还有什么意义呢?呵呵
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

三:具体实现
1、串行化的对象:Person类
Java代码  

    import java.io.Serializable;  
    /*   
     * time:2008-07-19   
     * author:coke   
     */   
      
    /* 
     *必须实现Serializable  
     */  
    public class Person implements Serializable {  
        private static final long serialVersionUID = 1L;  
        private int age; // will persist  
        private String name; // will persist  
        // transient 为Java保留字,告诉JVM以transient宣告的基本型态(primitive type)或物  
        // 件(object)变量不要序列化,例如敏感性数据像是密码等。  
        private transient String pwd; // will not persist  
        public Person() {  
        }  
      
        public Person(int age, String name,String pwd) {  
            this.age = age;  
            this.name = name;  
            this.pwd=pwd;  
        }  
      
        public int getAge() {  
            return age;  
        }  
      
        public void setAge(int age) {  
            this.age = age;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
      
        public String getPwd() {  
            return pwd;  
        }  
      
        public void setPwd(String pwd) {  
            this.pwd = pwd;  
        }  
    }  


2、串行化和反串行化
Java代码  收藏代码
    import java.io.FileNotFoundException;  
    import java.io.IOException;  
    import java.io.ObjectInputStream;  
    import java.io.ObjectOutputStream;  
    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import java.io.File;  
    /* 
     * time:2008-07-19 
     * author:coke 
     */  
    public class TestSerializable {  
        private static File f = null;  
      
        //串行化  
        public static void serialization() {  
            f = new File("D://t.m");  
            try {  
                if (f.exists())  
                    f.delete();  
                f.createNewFile();  
      
            } catch (IOException e1) {  
                // TODO Auto-generated catch block  
                e1.printStackTrace();  
            }  
            Person p = new Person(10, "xplq", "123456");  
            try {  
                ObjectOutputStream out = new ObjectOutputStream(  
                        new FileOutputStream(f));  
                out.writeObject(p);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        //反串行化  
        public static void deserialization() {  
            if (!f.exists())  
                return;  
            try {  
                ObjectInputStream input = new ObjectInputStream(  
                        new FileInputStream(f.getPath()));  
                try {  
                    Person p = (Person) input.readObject();  
                    System.out.println(p.getName());  
                    System.out.println(p.getAge());  
                    System.out.println(p.getPwd());  
                } catch (ClassNotFoundException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            } catch (FileNotFoundException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
        //测试  
        public static void main(String[] args) {  
            TestSerializable.serialization();  
            TestSerializable.deserialization();  
        }  
      
    }  


3.测试结果
xplq
10
null
因为pwd transient ,不能被串行化
分享到:
评论

相关推荐

    System.Runtime.Serialization.DLL.zip

    在.NET框架中,`System.Runtime.Serialization`命名空间是处理序列化和反序列化的核心组件,而`System.Runtime.Serialization.dll`则是这个命名空间对应的实现库。它包含了大量用于数据交换、持久化以及跨应用程序...

    System.Web.Script.Serialization.7z

    .net2.0版本的json操作类 ...System.Web.Script.Serialization的json操作类,位于3.0以上的System.Web.Extensions类库中. 本项目是从System.Web.Extensions中剥离出System.Web.Script.Serialization的完整项目

    System.Runtime.Serialization.dll

    放在bin文件夹 解决 System.Runtime.Serialization.Json无法引用的问题

    C# 对象串行化输入输出 演示代码

    描述中提到的代码可能涉及到使用BinaryFormatter进行对象串行化和反串行化的操作。以下是一个简单的例子: ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; // 假设有一个Bmp...

    C#344-对象串行化源代码

    .NET Framework会自动处理对象的串行化和反串行化,但无法处理私有字段和受保护字段。对于这些情况,可以使用[NonSerialized]特性来排除字段。 3. **BinaryFormatter**: .NET框架提供的BinaryFormatter类是默认的...

    Sybase.Modeling.Net.Serialization.dll

    Sybase.Modeling.Net.Serialization.dll

    详解PHP对象的串行化与反串行化

    在PHP编程中,串行化(Serialization)和反串行化(Unserialization)是两种重要的数据处理技术。它们允许开发者将复杂的数据结构,包括对象,转换为字符串形式,便于存储或者在网络上传输。当我们需要暂时保存对象...

    对象序列化:使用System.Xml.Serialization命名空间

    在.NET中,要实现对象的XML序列化,需要引入`System.Xml.Serialization`命名空间,这提供了必要的类和特性来控制序列化的过程。 首先,确保在项目中添加了对`System.Xml`库的引用,这是.NET Framework的一部分,...

    串行化保存和读取数据示例.zip

    3. **readObject()和writeObject()**:对于复杂的对象,可以重写`writeObject()`和`readObject()`方法来自定义串行化和反串行化的行为。这些方法允许你精确地控制哪些数据应该被保存和恢复。 4. **Externalizable...

    Visual Basic.NET 串行化参考手册(PDG)

    2.二进制串行化:使用System.Runtime.Serialization.Formatters.Binary命名空间中的BinaryFormatter类,将对象转换为二进制格式的数据。 实现XML串行化: 首先,你需要在要串行化的类上添加Serializable特性,表示...

    System.Runtime.Serialization.dll / ServiceModel.dll/ServiceModel.Web.dll

    在.NET中,`System.Runtime.Serialization.Json`命名空间提供了一组类,如`DataContractJsonSerializer`,它用于序列化和反序列化.NET对象到JSON格式,这对于AJAX调用和Web API接口非常有用。 总的来说,这三个DLL...

    PHP串行化与反串行化实例分析

    在PHP编程中,串行化(Serialization)和反串行化(Unserialization)是两种重要的数据处理技术。它们主要用于将复杂的数据结构,如对象,转换为字符串以便存储或传输,然后再将这些字符串恢复为原始数据结构。这在...

    C#图形对象的串行化实例

    接下来,我们可以使用`BinaryFormatter`类来进行串行化和反串行化操作: ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; // 串行化 public static void ...

    实例解析C++/CLI的串行化

    而反串行化(Deserialization)则是将串行化后的数据重新恢复为对象的过程。C++/CLI(C++ Common Language Infrastructure)是微软公司为C++语言扩展设计的,使得C++能够更容易地与.NET环境进行交互,支持托管代码和...

    sirenix.serialization.dll

    sirenix.serialization.dll

    java串行化详细的介绍了java串行化的概念

    2. **反序列化**:将字节流还原为对象。 在这个过程中,Java会根据对象的具体类型来决定如何序列化。对于基本类型的数据,可以直接转换;而对于复杂对象,则需要处理其内部结构。 #### 四、`serialVersionUID`的...

    kotlinx.serialization,Kotlin跨平台/多格式序列化.zip

    在这个上下文中,访问者模式被用来深度遍历对象图,从而实现序列化和反序列化的过程。由于这种处理是在编译时进行的,而不是运行时,因此避免了对反射的依赖,提高了性能,并且可以捕获潜在的类型错误。 二、跨平台...

    mfc 串行化的简单使用

    在这个类中,你需要重写`OnSerialize`函数,该函数会在对象被串行化或反串行化时被调用。 2. **实现`OnSerialize`函数**:在这个函数中,你需要调用基类版本的`OnSerialize`函数,并且根据`CArchive`对象的模式...

    XML序列化之System.Xml.Serialization demo

    本篇文章将深入探讨如何使用`System.Xml.Serialization`进行XML序列化和反序列化操作。 首先,我们需要了解XML序列化的概念。XML序列化是将对象的属性和字段转换为XML文档的过程。这使得对象的数据可以被保存到文件...

Global site tag (gtag.js) - Google Analytics