java里为什么要序列化?
1不序列化是二进制流,序列化也是二进制流,有什么不同?最后在计算机里不都是0和1保存嘛?还是说不序列化也可以恶保存,就是没有序列化保存的后好什么的?2比如我写记事本里写了...
1不序列化是二进制流,序列化也是二进制流,有什么不同?最后在计算机里不都是0和1保存嘛?还是说不序列化也可以恶保存,就是没有序列化保存的后好什么的?
2比如我写记事本里写了一篇文章,这里有对象吗?全都是文字啊,那我保存为文本文件的时候,也要序列化一下?然后我以后打开这个文本文件读取到内存,还要反序列化?
3比如实现购物信息记录的保存,不是要序列化吗,序列化以后保存的是文本文件还是什么文件,能用记事本打开看到文字的记录信息吗,不是说序列化后是字节流吗,那文本文件是字符流,那记录信息打开后应该是乱码才对啊,因为序列化后是字节流的!文本文件打开自然就是乱码了?
就不要说什么是序列化的概念什么了,我都看过好几遍了,说是为了保存对象结构什么的,但是还不是很理解,对于普通的字符串或者不序列化之间有何不同,还没明白,尽量用例子或者大白话给讲讲,不要太专业,通俗易懂就可以了 展开
2比如我写记事本里写了一篇文章,这里有对象吗?全都是文字啊,那我保存为文本文件的时候,也要序列化一下?然后我以后打开这个文本文件读取到内存,还要反序列化?
3比如实现购物信息记录的保存,不是要序列化吗,序列化以后保存的是文本文件还是什么文件,能用记事本打开看到文字的记录信息吗,不是说序列化后是字节流吗,那文本文件是字符流,那记录信息打开后应该是乱码才对啊,因为序列化后是字节流的!文本文件打开自然就是乱码了?
就不要说什么是序列化的概念什么了,我都看过好几遍了,说是为了保存对象结构什么的,但是还不是很理解,对于普通的字符串或者不序列化之间有何不同,还没明白,尽量用例子或者大白话给讲讲,不要太专业,通俗易懂就可以了 展开
7个回答
展开全部
楼主的问题很有意思,不过你对序列化和反序列的应用场景搞错了,我们说的序列化和反序列化是对JAVA而言(其他面向对象语言可能也有)的,序列化的实体是个对象,结果也是个对象,并非是格式化文本,你在记事本里看到的购物信息保存记录,其实不是对象序列化的结果,而是对象输出的格式化文本,真正的序列化对象是看不懂的。
在实际使用对象序列化时,一种应用场景是将对象序列化到持久化存储(本地硬盘),我们此时不想做文件解析,也不想有人读懂这个持久化文件,当我们需要时,可以直接采用反序列化将保存的文件生成为对象;另一种应用场景是在网络传输过程中,此时对象会在不同主机上传播,序列化会将对象转成码流由对端进行解析,这个解析过程不需要人参与。
普通字符串是经过解析后的对象,有对象到字符串要加入解析逻辑,人才能看懂。
序列化的结果是个只有JAVA虚拟机认识的文件,人不参与,只是用于保存对象或传输。
解决你的问题了么?
在实际使用对象序列化时,一种应用场景是将对象序列化到持久化存储(本地硬盘),我们此时不想做文件解析,也不想有人读懂这个持久化文件,当我们需要时,可以直接采用反序列化将保存的文件生成为对象;另一种应用场景是在网络传输过程中,此时对象会在不同主机上传播,序列化会将对象转成码流由对端进行解析,这个解析过程不需要人参与。
普通字符串是经过解析后的对象,有对象到字符串要加入解析逻辑,人才能看懂。
序列化的结果是个只有JAVA虚拟机认识的文件,人不参与,只是用于保存对象或传输。
解决你的问题了么?
更多追问追答
追问
序列化和购物信息记录里的字符串有关系吗?比如我不序列化,这些字就不能保存到硬盘了吗?
还一个就是序列化以后保存的对象在哪里啊,是购物信息记录里面的文字吗?都一起保存到硬盘上面了?还是放哪里,比如我打开购物信息记录里面只有:某某于某天购物等等,这里面哪有对象啊,跟看文本文件没区别啊,那咱们老说保存对象对象的 我不明白这个对象到底在哪里,和字符串有什么关系没
追答
序列化和字符串没有关系。
字符串是对象里的某些数据的输出结果,你看到的文本文件只包含了对象的一部分信息,你看到可能只是个值而已。
比如一个对象
object monkey
{
String monkeyName = "悟空";
long monkeyAge = 1000;
}
你输出的字符串可能只是这个:
悟空;
10000;
但对象很多信息丢掉了,比如对象名称,字段属性之类的。
序列化时把对象完整的输入到某个地方,比如文件,这个文件人类是看不懂的,但在反序列化时,文件就会被完成的读取为一个对象,和上面的对象一模一样,这样我们就可以在代码中对对象进行直接操作了。
are we clear?
推荐于2017-09-05 · 知道合伙人教育行家
关注
展开全部
序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例
序列化的什么特点:
如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
什么时候使用序列化:
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例
序列化的什么特点:
如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
什么时候使用序列化:
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你知道什么叫 序列化 吗?
你知道序列化的作用吗?
你可以把序列化,实现Serializable 接口,是序列化了的类告知该程序,这个类的对象可以读写。
读写不仅仅是在文本中读写该类,还可以通过别的流来进行读写。
没有序列化的类,是不能形成二进制读写流。
如果你随便敲写文字进去一个记事本里面。这个就不是序列化的范围了。序列化是指类对象的。你能确保你自己敲上去的文字就是类的对象了吗?你能确保你敲上去的是什么类的对象吗?
第三个问题,已经没有必要解释了。你要知道序列化是什么东西,你就不会问这问题
你知道序列化的作用吗?
你可以把序列化,实现Serializable 接口,是序列化了的类告知该程序,这个类的对象可以读写。
读写不仅仅是在文本中读写该类,还可以通过别的流来进行读写。
没有序列化的类,是不能形成二进制读写流。
如果你随便敲写文字进去一个记事本里面。这个就不是序列化的范围了。序列化是指类对象的。你能确保你自己敲上去的文字就是类的对象了吗?你能确保你敲上去的是什么类的对象吗?
第三个问题,已经没有必要解释了。你要知道序列化是什么东西,你就不会问这问题
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要使得javabean能够通过I/O在网络传输那么就必须实现Serializable接口,这是一种规范,就相当于你要tomcat调用你的servlet你必须实现它的接口一样。
要解释你的疑问就说说流吧:
首先流分为:字节流(Inputstream)、字符流(Reader),而你说的文件那就属于FileInputStream属于字节流,而你说的对象那就是ObjectInputStream也属于字节流,但是写对象必须实现Serializabled接口(这是API文档原话:只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。)
要解释你的疑问就说说流吧:
首先流分为:字节流(Inputstream)、字符流(Reader),而你说的文件那就属于FileInputStream属于字节流,而你说的对象那就是ObjectInputStream也属于字节流,但是写对象必须实现Serializabled接口(这是API文档原话:只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。)
追问
FileInputStream属于字节流,这也是字节流,是不是说如果我保存的不是对象,可以用这个流?可是java里好像都有对象啊,那就都只能用ObjectInputStream流?
那保存的购物记录是文本文件啊,打开能看到里面的文字信息,也没看到有对象啊,那序列化保存的对象在哪里啊,也在购物记录里吗,一起保存到硬盘里去了?
追答
文本文件属于字符流(Reader),让你看下API文档原话你就明白了:FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。
大哥还在纠结啊。。。
我最后就给你讲一个大家熟悉的一个例子
大家都用过web容器吧,现在就说weblogic
假如我们要去注册帐号,我们是先进入注册页面,把必填的都填完,最后点击注册按钮ok
此时客户端就发送了一个request注册的请求,
1客户端先把用户填写的信息保存在该请求中-------------------------------客户端
2然后把该请求request对象序列化,request对象保存了用户填写的注册信息
Socket socket=new Socket("ip",10000);
ObjectOutputStream oos1 = new ObjectOutputStream(socket.getOutputStream());
FileOutputStream out = new FileOutputStream("file.object"); //楼主看看跟文本文件有啥不一样的ObjectOutputStream oos2 = new ObjectOutputStream(out);
oos1.writeObject(request); //楼主要看序列化是怎么样的加这句
oos2.writeObject(request);
oos.close();
3然后服务器也就是weblogic接收该请求,进行反序列化-----------------------------服务器
ServerSocket ss=new ServerSocket(10000);
while(true){
socket=ss.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Request request= (Request) ois.readObject();
ois.close();
}
写的好累啊。。。望楼主采纳!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
以前我也不理解,不过现在我已经理解了:
是这样的,如果JAVA的对象要保存到硬盘或者要传输,必须实现Serializable接口,则这个接口,里面什么方法都没,它只是一个标识,而且,最好有一个序列的版本号,如private static final long serialVersionUID = 1L;以前我做过实验,我写了一个类Person,然后Person p=new Person();通过序列化,我用代码把p这个对象,保存在文件文件里了!不序列化,绝对不可能保存在计算机硬盘里!
是这样的,如果JAVA的对象要保存到硬盘或者要传输,必须实现Serializable接口,则这个接口,里面什么方法都没,它只是一个标识,而且,最好有一个序列的版本号,如private static final long serialVersionUID = 1L;以前我做过实验,我写了一个类Person,然后Person p=new Person();通过序列化,我用代码把p这个对象,保存在文件文件里了!不序列化,绝对不可能保存在计算机硬盘里!
追问
那文本文件打开后是不是只能看到字符串,看不见保存的对象信息?但是这个文件里面确实有对象信息,只不过系统不给你显示出来,只显示字符串内容而已?而且这个文件实际大小应该是字符串大小+对象大小,但是系统一样只显示文本信息的字符串大小?
是这么理解吧?
追答
我用代码把p这个对象,保存在文件文件里后,打开看了,不像乱码,但又像乱码的东西。你说得对,只能看到字符串,看不见保存的对象信息,但,你用代码处理后,就可以看见保存的对象信息了。要自己写代码处理,当初怎么写,就反过来,就可以显示对象的信息了。大小与你的对象个数有关,我那时也做了试验,我循环写10与10000次,大小就不一样了。文件大小,不好说,应该只与对象有关,哪来的什么字符串。代码是别人帮我写字,但忘记在哪了,不然,贴出来给你,你就理解了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询