java对象序列化的思考,没头绪,不知我想法哪里有错

善桀 2010-01-08 05:41:23
如果想让java对象在网络间传输,那么就必须对该类实现序列化接口(implements Serializable)。
比如我写一个类,我认为它会在网络上传输,所以我为该类实现了序列化“implements Serializable”,
并且在该类中我调用了许多其他类(如调用很多java类库的类或其他包里的很多类)并创建了许多其他类
的对象,那么只有当前类实现了序列化接口够吗?因为我在传输一个对象时要把它内部所有的信息传输过去
才行,可它内部用到的其它类并没有实现序列化,这种情况能传输吗?我感觉是既然其他类并没有实现
序列化,他们的对象当然无法传输,这怎么办?
打个比方,在hibernate中我定义一个Student类,给它和数据库建立关系映射(O/R),现在我不把Student类
中的id作为主键,我想把Student类中的id和name属性都删掉,然后再专门建立一个StudentPK类,里面有id和name
属性,之后把StudentPK放入Student类中作为主键,就是hibernate中常用到的复合主键。hibernate要求必须为
StudentPK这个类实现序列化,也就是为了防止Student类在网络中传输,所以要Student的属性StudentPK必须实现
序列化implements Serializable。这里我有一个问题,既然要求属性StudentPK序列化,那是不是我们自己也应该
检查下Student内部中的其他属性是否实现了序列化,假如它有很多其他类型的属性,如Person,String等,难道
我们必须检查Student内部所有的类是否实现了序列化?检查完是不是还要检查这些类里面的属性是否也实现了序列化,例如是不是应该看下Person这个类内部的类也同样实现了序列化,如此一来就要把整个树状结构涉及到的所有类都检查一遍
并为他们实现序列化,这太不可思议了吧
所以我认为java所有的类都应该实现序列化接口,因为都有可能在网络上传输,大家怎么认为?
提前谢过各位!!!
...全文
181 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈特中尉 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qqcrazyboy 的回复:]
该类实现了序列化“implements Serializable”,
在该类中调用的其他类不用实现序列化接口!
因为其他类的对象在该类里面可以看成是该类的变量!
int a=100;
Person p=new Person();
该类序列化,确保了该类里的所有属性和方法都“被序列化”!
[/Quote]

实在抱歉,本人搞错了!回到学校一试果真不行!抱歉!小弟初涉江湖,望各位前辈多多包涵!
哈特中尉 2010-01-09
  • 打赏
  • 举报
回复
该类实现了序列化“implements Serializable”,
在该类中调用的其他类不用实现序列化接口!
因为其他类的对象在该类里面可以看成是该类的变量
int a=100;
Person p=new Person();
该类序列化,确保了该类里的所有属性和方法都“被序列化”!
javajiao 2010-01-09
  • 打赏
  • 举报
回复
帮忙顶
不白吃饭 2010-01-09
  • 打赏
  • 举报
回复
6楼正解,,
SambaGao 2010-01-09
  • 打赏
  • 举报
回复
当传一个对象的时候时需要序列话。
sotom 2010-01-09
  • 打赏
  • 举报
回复
Java的大部分代码是执行在服务器上的,而数据又只和服务器交互,所以不算远程交互。

另外 序列化implements Serializable 这个接口看其源码其实什么都没做,所以序列化实现这个接口只是一个标志,告诉这个类需要序列化,类似的理解可以参照JSON.
lzw517 2010-01-09
  • 打赏
  • 举报
回复
山谷算高调
icy_csdn 2010-01-09
  • 打赏
  • 举报
回复
1. 你的担心是正确的,所有其子类都必须是Serializable;
java.lang.Object没有实现Serializable,所以那些你自己定义的一般的类是不能够Serializable的,除非你实现了这个接口。
同时,其包含的所有对象都必须是Serializable的;
2. 不过也不用这么担心,因为一般情况下,JAVA的很多基本的类已经是Serializable的;
像 AWT and Swing GUI components, java基本数据类型,strings, arrays 等一般都是Serializable的。
因为基本数据类型,String还有数据等都是,所以一般你自己定义的只需要实现Serializable即可。
3. 如果你的类中确实有不需要Serializable或者不能Serializable的,非常简单用transient符号
如:transient private Thread thread1;
4. 并非所有的类都要Serializable,有些是没有意义的
如线程就是没有任何意义。
amdgaming 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nihuajie05 的回复:]
楼主。。。
J2SE都大多数都是本地程序,为什么要传输,传给谁去。。
您的概念太先进,适合去google应聘云计算相关职位。

[/Quote]
并不是 这样的啊, cs 架构的 程序 是需要 客户端和服务端 交互的
jane123456789 2010-01-09
  • 打赏
  • 举报
回复
不知所云
nihuajie05 2010-01-09
  • 打赏
  • 举报
回复
楼主,序列化的目的是什么?
序列化本身的目的并不仅仅是用于网络传输。
序列化让我们能够保存一个Ojbect instance当前的状态。通过序列化以后的结果,我们能够重新构造一个跟该实例一摸一样的实例。
想想这样的情况,当我的程序中一个对象要对一个文件写时,该文件被其他程序持有了写权限,但是我既不想让我的程序失败,同时也不想干等在那。于是我序列化我的对象,等到某个可能该文件已经被释放的时候再构造起这个对象,来执行写操作。
这能够算是序列化的初衷么?
但是,是不是我们的程序中都需要这样的功能呢,显然不是。
楼主说EJB在传输中需要,但是你原文说的是所有的类都应该实现该接口。
程序不是设计的最完整就是最好的。找到自己合适的点才是最重要的。
善桀 2010-01-09
  • 打赏
  • 举报
回复
1楼....
感觉我发错版块了,更好去J2EE问问。在EJB分布式应用中,传输对象不奇怪吧?
6楼最靠谱!
借我那把枪吧 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nihuajie05 的回复:]
楼主。。。
J2SE都大多数都是本地程序,为什么要传输,传给谁去。。
您的概念太先进,适合去google应聘云计算相关职位。

[/Quote]高人
xiaohuanjie 2010-01-09
  • 打赏
  • 举报
回复
不懂,帮顶
nihuajie05 2010-01-08
  • 打赏
  • 举报
回复
楼主。。。
J2SE都大多数都是本地程序,为什么要传输,传给谁去。。
您的概念太先进,适合去google应聘云计算相关职位。

62,621

社区成员

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

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