社区
Java SE
帖子详情
为什么实现了Serializable接口就具备了被序列化的能力
henliqi
2011-02-25 09:05:01
java类序列化的实现机制的是怎么样的?有谁能详细讲一下?
...全文
250
14
打赏
收藏
为什么实现了Serializable接口就具备了被序列化的能力
java类序列化的实现机制的是怎么样的?有谁能详细讲一下?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
从名字看,不是"就被序列化了“,而是”可以被序列化“
火龙果被占用了
2011-02-25
打赏
举报
回复
因为在序列化的时候,J2SE 类库在代码中写了 xxx instanceof Serializable 的判断。
这只是一个用于分类的标记接口,并且 JAVA 中强制地进行了检查是否实现了这个接口。
第86项:谨慎地
实现
Serializable
接口
要想使一个类的实例可被
序列化
,非常简单,只要在它的声明中假如“implemants
Serializable
”字样即可。正因为太容易了,所以普遍存在这样一种误解,认为程序猿可以毫不费力就可以
实现
序列化
。实际情形要复杂得多。虽然使一个类可
序列化
的直接成本可以忽略不计,但长期的成本通常是很高的。
实现
Serializable
接口
而付出的最大代价是,一旦一个类被发布,就大大降低了“改变这个类的实...
Java中为什么
实现
了
Serializable
接口
就
具备
了被
序列化
的
能力
以及serialVersionUID的作用...
Java 规定的内部机制,
实现
Serializable
接口
就行了,这个
接口
只是个标记性的
接口
,表示类的设计者已经允许这个类型的对象被
序列化
写入磁盘或通过网络发送,对于有保密要求的东西一般不
实现
这个
接口
防止无意间复制到 jvm 内存之外。如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为 transient。默认的 serializat...
Java中为什么
实现
了
Serializable
接口
就
具备
了被
序列化
的
能力
以及serialVersionUID的作用
原文地址:http://czh.javaeye.com/blog/657761serialVersionUID作用:
序列化
时为了保持版本的兼容性,即在版本升级时反
序列化
仍保持对象的唯一性。 有两种生成方式: 一个是默认的1L,比如:private static final long se... serialVersionUID作用:
序列化
时为了保持版本的兼容性,即在版本升级时反
序列化
仍保持对象的唯一性。 有两种生成方式: 一个是默认的1L,比如:private static fin
对象
序列化
Serializable
对象
序列化
就是把一个对象变为二进制的数据流的一种方法,通过对象
序列化
,可以方便的
实现
对象的传输和储存如果一个对象想要
实现
序列化
,就要
实现
Serializable
接口
,改
接口
如下改
接口
没有任何方法,所有此
接口
是一个标识,标识这个类
具备
了
序列化
的
能力
。package com.example.jpa.test; import java.io.
Serializable
; /** * com.xing...
为什么不能轻易的
实现
序列化
(implements
Serializable
) 摘自《Effective Java》
为什么不能轻易的
实现
序列化
(implements
Serializable
) 摘自《Effective Java》`第11章
序列化
本章关注对象的
序列化
(object serialization)API,它提供了一个框架,用来将对象编码成字节流,以及从字节流编码中重新构建对象。”将一个对象编码成一个字节流”,这就称作
序列化
(serializing)该对象;相反的处理过程被称作反
序列化
(deseria
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章