原文http://xiebh.iteye.com/blog/121311
1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
- Foo myFoo = new Foo();
- myFoo .setWidth(37);
- myFoo.setHeight(70);
当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。
- FileOutputStream fs = new FileOutputStream("foo.ser");
- ObjectOutputStream os = new ObjectOutputStream(fs);
- os.writeObject(myFoo);
4、实现序列化(保存到一个文件)的步骤
a)Make a FileOutputStream
- FileOutputStream fs = new FileOutputStream("foo.ser");
b)Make a ObjectOutputStream
- ObjectOutputStream os = new ObjectOutputStream(fs);
c)write the object
- os.writeObject(myObject1);
- os.writeObject(myObject2);
- os.writeObject(myObject3);
d) close the ObjectOutputStream
- os.close();
5、举例说明
- import java.io.*;
- public class Box implements Serializable
- {
- private int width;
- private int height;
- public void setWidth(int width){
- this.width = width;
- }
- public void setHeight(int height){
- this.height = height;
- }
- public static void main(String[] args){
- Box myBox = new Box();
- myBox.setWidth(50);
- myBox.setHeight(30);
- try{
- FileOutputStream fs = new FileOutputStream("foo.ser");
- ObjectOutputStream os = new ObjectOutputStream(fs);
- os.writeObject(myBox);
- os.close();
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- }
6、相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
相关推荐
学习Java序列化,里面包含一份PPT以及相应的源码演示
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
java 序列化详细解释 很详细 适用于高级软件开发者
java序列化代码示例,详细讲解序列化作用于使用注意规则项!!!
Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
大家请看Java的序列化结构有不足的地方请指教也希望指出不足的地方。
java序列化和反序列化java序列化和反序列化java序列化和反序列化
将java数据 序列化成PHP的格式 a:4:{s:6:"title2";s:13:"这是标题2";s:6:"title3";s:13:"这是标题3";s:5:"title";s:13:"这是标题1";s:6:"title4";s:13:"这是标题4";} 或者a:1:{i:0;a:1:{s:4:"name";s:10:"这是1321";...
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
该资源提供了java常见的三个序列化框架,分别是:JBoss Marshalling,messagePack,protobuf-java
07-Java序列化面试题(10题)-新增
java 序列化,java 序列化,java 序列化,java 序列化,java 序列化,java 序列化
NULL 博文链接:https://hw1287789687.iteye.com/blog/2190768
E043-服务漏洞利用及加固-利用Java序列化漏洞进行渗透测试
java序列化是面试中经常涉及的重要主题之一。对Java序列化的深入了解不仅可以展示你的编程技能,还能体现出你对Java核心概念的掌握。本文精选了20道复杂的Java序列化面试题,并提供了详细的解析,旨在帮助你更好地...
Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化
Java序列化机制(2)- serialVersionUID 实验 http://blog.csdn.net/suileisl/article/details/16991753
android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...
详细讲解了java的序列化用处、原理、算法、如何实现。希望能帮到大家。