为什么实现了Serializable接口就具备了被序列化的能力

henliqi 2011-02-25 09:05:01
java类序列化的实现机制的是怎么样的?有谁能详细讲一下?
...全文
250 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2011-02-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 humanity 的回复:]

Java 规定的内部机制,实现 Serializable 接口就行了,这个接口只是个标记性的接口,表示类的设计者已经允许这个类型的对象被序列化写入磁盘或通过网络发送,对于有保密要求的东西一般不实现这个接口防止无意间复制到 jvm 内存之外。如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为 transient。

默认的 seria……
[/Quote]

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

http://java.sun.com/developer/technicalArticles/ALT/serialization/
智鹿软件 2011-02-25
  • 打赏
  • 举报
回复
1楼回复的很好了。
————这个接口只是个标记性的接口
Inhibitory 2011-02-25
  • 打赏
  • 举报
回复
JVM内部会用反射机制来取得属性值,然后保存与写入,神秘都是在反射机制上
jennyzhangyi 2011-02-25
  • 打赏
  • 举报
回复
以前只知道怎么用,并不知道原理是什么,今天学习了
gloomyfish 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]

因为在序列化的时候,J2SE 类库在代码中写了 xxx instanceof Serializable 的判断。

这只是一个用于分类的标记接口,并且 JAVA 中强制地进行了检查是否实现了这个接口。
[/Quote]
如果反序列化的时候找不到对应的class文件,de-serialization 必然失败,一个方法就
重写resolveClass()这个方法,Java序列化文件以后会让很多升级项目不能读写以前序列化的
文件,原因之一就找不到以前的class文件了.
licip 2011-02-25
  • 打赏
  • 举报
回复
1楼解释很好,学习了
clarck_913 2011-02-25
  • 打赏
  • 举报
回复
楼上强人

解释很到位
humanity 2011-02-25
  • 打赏
  • 举报
回复
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/

Mybeautiful 2011-02-25
  • 打赏
  • 举报
回复
从名字看,不是"就被序列化了“,而是”可以被序列化“
  • 打赏
  • 举报
回复
因为在序列化的时候,J2SE 类库在代码中写了 xxx instanceof Serializable 的判断。

这只是一个用于分类的标记接口,并且 JAVA 中强制地进行了检查是否实现了这个接口。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧