学Java也有一段时间了,但是对于序列化的了解还是比较欠缺.
  我知道基本用途和方式, 但是却无法了解为何必须要使用这种方式来实现对象的传输.
  我可以得到你们的帮助吗, 最好附加上实例说明, 高分提问.

解决方案 »

  1.   

    可以去看《think in java》这本书,上面叙述的很详细。
      

  2.   

    COPY的,看下对你是否有用简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
        如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!举个例子来说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的!    以下序列化机制的解决方案(解决对象引用的问题):    1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)    2.当要保存一个对象时,先检查该对象是否被保存了。    3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象通过以上的步骤序列化机制解决了对象引用的问题!序列化的应用:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
          java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
        java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意:不是每个类都可序列化,有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。标识版本的serialVersionUID。
          如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议所有可序列化类都显式声明 serialVersionUID 值,原因计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修改器显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类 -- serialVersionUID 字段作为继承成员没有用处。
      

  3.   

    准确的说是用java本身的字节流方式来实现这个序列化,当然,在网络传输过程中,任何的立体数据结构都要转换为平面结构。
      

  4.   

    只是提供了一种通用的对象序列化的方式,可以用它来进行数据传输,没有说必须用他传输,现在很多是采用xml来传送数据的。
      

  5.   

    序列化在VC++ 的MFC里就有了,不过人家是叫串行化,并且适应的范围也没java那么广没有人强制你一定非得用序列化的方式传对象,但是用序列化传对象比手动编写程序传对象的确是要简单得多(代码少),并且也准确得多(比如可能对象的某些属性转换时出错)。楼主可以自己体会一下象下面这样的一个类(Student)的对象不用序列化的方式,从一台机器传送到另一台机器会有多麻烦:
    public class Person{
        ......
    }
    public class School{
        ......
    }
    public class City{
        ......
    }public class Student{
        private Person father = new Person();
        private Person mother = new Person();
        private School school = new School();
        private City city = new City();
        private Image photo = ......
        ......
    }