java类序列化的实现机制的是怎么样的?有谁能详细讲一下?

解决方案 »

  1.   

    Java 规定的内部机制,实现 Serializable 接口就行了,这个接口只是个标记性的接口,表示类的设计者已经允许这个类型的对象被序列化写入磁盘或通过网络发送,对于有保密要求的东西一般不实现这个接口防止无意间复制到 jvm 内存之外。如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为 transient。默认的 serialization 对类的结构有要求,一般将来版本升级了导致服务端和客户版本不一样,或者你用新版本读取一个以前旧版本写入磁盘的序列化的对象的话,需要这两个版本是兼容的,达到这个要求至少包括下面这个字段,并且新旧两个版本的类中它的值应该是一样的,其它特殊情况规范也有办法做到,比如你的结构变了,以前 name / phone 都是 A 的字段,后来新版本创建了一个内部类叫 Contact 把 name 和 phone 
     并到这两个字段移到内部类 Contact 中去了的话,Java 也有办法在新版本中提供自定义 readObject/writeObject 这个过程来确保兼容旧版本。private static final long serialVersionUID; // 在一个类的多个版本中要相同的值,对于不它的类中,它们的值不要求唯一。http://java.sun.com/developer/technicalArticles/Programming/serialization/
      

  2.   

    JVM内部会用反射机制来取得属性值,然后保存与写入,神秘都是在反射机制上
      

  3.   

    因为在序列化的时候,J2SE 类库在代码中写了 xxx instanceof Serializable 的判断。这只是一个用于分类的标记接口,并且 JAVA 中强制地进行了检查是否实现了这个接口。
      

  4.   

    如果反序列化的时候找不到对应的class文件,de-serialization 必然失败,一个方法就
    重写resolveClass()这个方法,Java序列化文件以后会让很多升级项目不能读写以前序列化的
    文件,原因之一就找不到以前的class文件了.
      

  5.   


    我以前按这个链接写了个当把字段移到新建的内部类时的自定义 readObject/writeObject 的,实验成功了,通过网络在两个程序间复制对象,两端的版本不同,类的结构不同。http://java.sun.com/developer/technicalArticles/ALT/serialization/