转载
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类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
相关推荐
C# xml序列化及反序列化(解析xml为对象及对象转xml保存),方法一反序列化取节点KV值,方法二反序列化取节点标签值,方法三取节点KV值,并增加节点对象数组及节点标签组合反序列化
java 的序列化与反序列化举例测试
/// 序列化模型对象为Json /// /// 模型类型 /// 模型对象 /// <returns></returns> public static string GetJson(T model) where T : new() { return new JavaScriptSerializer().Serialize(model); } ...
Dictionary序列化源码 datatable序列化源码 文件反序列化为泛型数组 序列化泛型数组为xml文件 值得下载 源码可以运行
C#中二进制数组h和各种常规数组的转换,二进制序列化和json序列化方法以及对应的反序列化方法的例子,帮助初学者。
XML序列化与反序列化整理文档(12套) (附xml转化为序列化代码工具XML 2 Class) (附XML序列化的实例原代码)
此例子先用VS生成基于PLCOpen的XSD生成对应的类,然后利用序列化和反序列化的方式写入读取XML文件
海尔2307户户通直播星序列化工具为工厂维修机器使用使用场景:(1)更换flash需要重新进行序列化, 更改stbid或保留stbid不变1.本工具不需要连接工厂数据库,而是直接从HIC2307_NDSCA_xxxxxxxx_xxxxxxxx.dat文件里...
C#Xml序列化与反序列化,适用于与第三方系统做接口,入参和出参为XML,XML自动转实体,实体自动转Xml
Person 类有两个属性:name 和 age,其中 age 属性被标记为 transient,表示不参与序列化。我们创建了一个 Person 对象,并将其序列化到文件 person.ser 中。然后,我们从文件中反序列化对象,并打印反序列化后的...
序列化 (serialization):将对象的状态信息转换为可以存储或传输的形式的过程。 与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 序列化的目的 1、以某种存储形式使...
此示例代码为:将实体类序列化Json和binary格式的数据
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化.NET对象序列化与数据持久化(Q群号:152088818 本群只为有经验的.NET开发者...
这是Java序列化标准规范,对于研究序列化源码能够提供指导作用,为深入研究Java序列技术奠定基础。
java序列化与反序列化,且支持转化为16进制存储,一个简单的例子
窗体序列化与反序列化组件DEMO代码,将窗体序列化后保存为文件,下次打开还原窗体原貌,适用于窗体布局记忆功能的实现
帮助你更好的了解反射和序列化的原理 不为别的,只为帮助你们更好的学习
(5)如果Form2的两个文本框中分别为保存的两个整数,则说明序列化、反序列化都成功了。 可以参考我博客的两篇文章 序列化:http://blog.csdn.net/jiutao_tang/archive/2011/06/18/6554016.aspx 窗体间变量的值传递...
序列化是将对象转换为字节流以将其保存在内存、数据库或者磁盘文件中的过程,其主要目的是保存对象的状态,以便可以在需要时重新创建对象,将存放在内存、数据库、磁盘文件中的字节流转换为对象的过程即为反序列化的...