黑马程序员技术交流社区

标题: 对象的序列化 [打印本页]

作者: 罗利华    时间: 2013-1-7 01:51
标题: 对象的序列化
看了毕老师视频里提到的对象序列化,是不是和保证数据唯一有关系呀,望高手详解,
作者: 郭俊    时间: 2013-1-7 23:07
把Java对象转换为字节序列的过程称为对象的序列化。
         对象要以字节流存储的话,就必须 “打碎” 。
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
   对应例子,视频上有
作者: sun~~    时间: 2013-1-7 23:29
 .net的运行时环境用来支持用户定义类型的流化的机制。它是将对象实例的状态存储到存储媒体的过程。在序列化的过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
序列化可以给我们带来什么样的方便之处呢?
         1.持久存储
        有时我们经常需要将对象的字段值保存到磁盘中,以便在以后检索此数据。虽然没有序列化也可以完成这项工作,但其方法往往是很繁琐而且容易出错的,并且在需要跟踪对象的层次结构时,会变得越来越麻烦。我们可以想 象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘或从磁盘还原这些字段和属性。不过序列化就不一样了,它提供了轻松实现这个目标的快捷方法。
         公共语言运行时(CLR)管理对象在内存中的分布,.NET框架则通过使用反射提供自动的序列化机制。对象被序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列的引用对象,这样就确保了同一对象不被序列化多次。.NET框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为Serializable。否则序列化程序试图序列化未标记的对象时将为出现异常。Serializable属性用来明确表示该类可以被序列化。同样的,我们可以用NonSerializable属性用来明确表示类不能被序列化。
这样反序列化已序列化的类时,将重新创建该类,并还原所有数据成员的值。
         2.按值封送
        对象仅在创建对象的应用程序域中有效。除非对象是从MarshalByRefObject派生得到或标记为Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。
序列化的实现
         序列化的机制是将类的值转化为一般的字节流,然后把这个流存储到存储媒介上。.NET框架里提供了这样两个类 BinaryFormatter和SoapFormatter。BinaryFormatter使用二进制格式化程序进行序列化。它将类中的所有成员变量(甚至标记为 private 的变量)都序列化。而SoapFormatter使用XML格式化,因此会有更好的可移植性。
下面是BinaryFormatter序列化和反序列化

基本序列化
         要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:[Serializable]
public class ObjectSerializable
{
    public int s1 = 0;
    public int s2 = 0;
    public String str = null;
}

作者: 罗利华    时间: 2013-1-8 13:13
郭俊 发表于 2013-1-7 23:07
把Java对象转换为字节序列的过程称为对象的序列化。
         对象要以字节流存储的话,就必须 “打碎” 。 ...

只是将java对象转换为字节序列,然后再存储到本地文件上吗,有没有其他的特点呀,这样做有什么作用呢,
作者: 郭俊    时间: 2013-1-8 17:59
修心者 发表于 2013-1-8 13:13
只是将java对象转换为字节序列,然后再存储到本地文件上吗,有没有其他的特点呀,这样做有什么作用呢, ...

    这样做为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来
作者: 郑君    时间: 2013-1-8 20:06
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制。
作者: 罗利华    时间: 2013-1-8 22:58
郭俊 发表于 2013-1-8 17:59
这样做为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来 ...

嗯,差不多明白了,多谢了,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2