呵呵,真惭愧,还真没想过这个问题。
javadoc上写着没实现Serializable就不能序列化和反序列化
Clonable接口也是,没有定义clone函数,只是说实现了Clonable接口
的类会改变父类的clone()函数返回子类的逐域拷贝。具体原理没研究过。

解决方案 »

  1.   

    标记就是告诉JVM这是什么。
    什么是序列化可以看看这里:
    http://www.j2medev.com/bbs/boke.asp?liuxm.showtopic.450.html
      

  2.   

    好文章 受益匪浅终于明白为什么Eclipse老是要我为类写序列号了多谢 支持一下
      

  3.   

    我想知道的是为什么这样做可以,而不是如何做。也就是为什么不实现Serializable接口就不能序列化,这个接口什么也没做啊。
      

  4.   

    接口就是类之间交流的协议
    只有你implement 接口  
    你才具有改接口赋予的能力
    显然实现了Serializable接口的类
    jvm在处理该类对象的序列化的时候,会检查这个对象是不是有遵守这个协议,
    好理解一点了吗! 
      

  5.   

    1: 实现了 java.io.Serializable 接口的话 , JVM 才认为你确实需要 把这个类的对象的状态保存在什么地方以便以后恢复, 如果没有实现这个接口, JVM 安全性认为这可不应该保存状态。
    2: 对于实现了 Serializable 接口的, 如果它提供了 readObject(ObjectInputStream) / writeObject(ObjectOutputStream) 方法的话, JVM 使用这对方法,如果没有提供的话,JVM 使用默认的方式来 保存/恢复 对象的状态。
    3: private static final long serialVersionUID 这个东西用来标识一个类,当我的一个类(比如 工作在 Socket 客户端)是 1.2 版本,另外一个(比如工作在Socket 服务端)是 1.3 版本,他们有些地方不完全相同,JVM 还是可以认可他的(当然还需要满足一些条件,这也是 Java 类库中存在很多 @deprecated 类的缘故,因为版本升级类成员不可以比原来少,很多实现中采用 return null ; 或者 throw new UnsupportedOperationException() 的方式改写新版本中 @deprecated 方法)。在 log4j 的例子中我就用过 DatagramAppender 发送一个 LoggingEvent 对象,它是 log4j 1.2.8 版本,接收端 Log4jRadio 使用 log4j 1.2.12 ,版本不同也能工作。
      

  6.   

    1.标记需要做什么操作。虽然接口没有写任何方法但是jvm会实现某些方法。
    2。限制操作,比如说你可以写自己的类就是不让人家序列化,就是不让人家克隆。
    3。检查是否真的实现了接口规定,比如说牵涉到rmi的时候就要考虑实现serializable接口,自己本身就有了这个意识;然后实现的这个类是否真的能序列化,又要牵涉到所有引用类能否被序列化。当然这个有点牵强,因为这也要到运行时才能发现。但是首先要提出这个概念来,jvm才能对这些操作进行规范,起码抛出异常都简单明了一些把。
    嗯,还是没说清楚。