- 浏览: 1476135 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
java 为什么序列化?为什么不是所有的类序列化? 收藏
为什么JAVA要实现对象序列化
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!举个例子来说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,现在我们对两个类进行实例化{ A a = new A(); B b = new B(); },这时在内存中实际上分配了两个空间,一个存储对象a,一个存储对象b,接下来我们想将它们写入到磁盘的一个文件中去,就在写入文件时出现了问题!因为对象b包含对对象a的引用,所以系统会自动的将a的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,内存分配了三个空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的!
以下序列化机制的解决方案:
1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)
2.当要保存一个对象时,先检查该对象是否被保存了。
3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象
通过以上的步骤序列化机制解决了对象引用的问题!
序列化的实现
将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
修改默认的序列化机制
在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含这种特殊问题的类提供了如下的方法定义:
private void readObject(ObjectInputStream in) throws
IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws
IOException;
(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)
使用以上方法我们可以手动对那些你又想序列化又不可以被序列化的数据字段进行写出和读入操作。
下面是一个典型的例子,java.awt.geom包中的Point2D.Double类就是不可序列化的,因为该类没有实现Serializable接口,在我的例子中将把它当作LabeledPoint类中的一个数据字段,并演示如何将其序列化!
view plaincopy to clipboardprint?
import java.io.*;
import java.awt.geom.*;
public class TransientTest
{
public static void main(String[] args)
{
LabeledPoint label = new LabeledPoint("Book", 5.00, 5.00);
try
{
System.out.println(label);//写入前
ObjectOutputStream out = new ObjectOutputStream(new
FileOutputStream("Label.txt"));
out.writeObject(label);
out.close();
System.out.println(label);//写入后
ObjectInputStream in = new ObjectInputStream(new
FileInputStream("Label.txt"));
LabeledPoint label1 = (LabeledPoint)in.readObject();
in.close();
System.out.println(label1);//读出并加1.0后
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class LabeledPoint implements Serializable
{
public LabeledPoint(String str, double x, double y)
{
label = str;
point = new Point2D.Double(x, y);
}
private void writeObject(ObjectOutputStream out) throws IOException
{
/**
*必须通过调用defaultWriteObject()方法来写入
*对象的描述以及那些可以被序列化的字段
*/
out.defaultWriteObject();
out.writeDouble(point.getX());
out.writeDouble(point.getY());
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
/**
*必须调用defaultReadObject()方法
*/
in.defaultReadObject();
double x = in.readDouble() + 1.0;
double y = in.readDouble() + 1.0;
point = new Point2D.Double(x, y);
}
public String toString()
{
return getClass().getName()
+ "[label = "+ label
+ ", point.getX() = "+ point.getX()
+ ", point.getY() = "+ point.getY()
+ "]";
}
private String label;
transient private Point2D.Double point;
}
import java.io.*;
import java.awt.geom.*;
public class TransientTest
{
public static void main(String[] args)
{
LabeledPoint label = new LabeledPoint("Book", 5.00, 5.00);
try
{
System.out.println(label);//写入前
ObjectOutputStream out = new ObjectOutputStream(new
FileOutputStream("Label.txt"));
out.writeObject(label);
out.close();
System.out.println(label);//写入后
ObjectInputStream in = new ObjectInputStream(new
FileInputStream("Label.txt"));
LabeledPoint label1 = (LabeledPoint)in.readObject();
in.close();
System.out.println(label1);//读出并加1.0后
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class LabeledPoint implements Serializable
{
public LabeledPoint(String str, double x, double y)
{
label = str;
point = new Point2D.Double(x, y);
}
private void writeObject(ObjectOutputStream out) throws IOException
{
/**
*必须通过调用defaultWriteObject()方法来写入
*对象的描述以及那些可以被序列化的字段
*/
out.defaultWriteObject();
out.writeDouble(point.getX());
out.writeDouble(point.getY());
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
/**
*必须调用defaultReadObject()方法
*/
in.defaultReadObject();
double x = in.readDouble() + 1.0;
double y = in.readDouble() + 1.0;
point = new Point2D.Double(x, y);
}
public String toString()
{
return getClass().getName()
+ "[label = "+ label
+ ", point.getX() = "+ point.getX()
+ ", point.getY() = "+ point.getY()
+ "]";
}
private String label;
transient private Point2D.Double point;
}
为什么不是所有的类都序列化?
很重要的一个原因就是为了安全,java的类安全机制是做的很好的.
对于一个你要传输的对象,比如写到文件,或者进行rmi传输等等,在传输的过程中,
这个对象的private等域是不受保护的.
还有就是一些资源分配的问题,比如thread,序列化是很难对他重新分配资源,
所以并非所有的类都可以序列化.
有哪位大侠深入浅出的讲一件深层次的东西。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kky2010_110/archive/2009/11/20/4839807.aspx
发表评论
-
ISO-8859_1统一编码 java
2011-08-19 11:07 1967Java中文问题一直困扰着很多初学者,如果了解了Java系统的 ... -
UTF-8 GBK UTF8 GB2312
2011-08-19 10:46 1890UTF-8:Unicode TransformationFor ... -
Properties 类读取配置文件
2011-08-17 22:37 14411、使用java.util.Properties类的load( ... -
Java编程之四大名著
2011-08-06 10:07 1423中文第四版 http://download.csdn.n ... -
JDK5.0 新特性
2011-07-28 20:02 13471.AutoBoxing 原来int是非 ... -
JDK6的新特性
2011-07-28 19:57 1750JDK6的新特性 JDK6的新特性之一_Desktop类和Sy ... -
线程同步
2011-07-25 11:34 1242作者 : buaawhl http://www.iteye.c ... -
ZipInputStream类
2011-07-22 11:33 18719《Java开发实战经典》第12章Java IO,Java ... -
String、StringBuffer和StringBuilder的区别
2011-07-14 15:04 1327String是不可变的,StringBuffer是可变的;St ... -
精通JAVA核心技术
2011-07-11 11:31 1242http://www.2cto.com/ebook/20100 ... -
Java多线程sleep(),join(),interrupt(),wait(),notify()
2011-07-06 22:51 4869浅析 Java Thread.join() 一、在研究j ... -
FileInputStream/FileOutputStream的应用
2011-07-06 15:06 1378这是一对继承于InputStream和OutputStream ... -
Java基础之理解JNI原理
2011-07-05 14:55 1283JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA ... -
面向对象和面向过程的区别
2011-07-04 09:52 1378面向过程就是分析出解 ... -
Java参数传值还是传引用
2011-07-03 20:52 3602参数是按值而不是按 ... -
JAVA排序汇总
2011-06-29 18:07 1422package com.softeem.jbs.lesson4 ... -
Java流操作,InputStream、OutputStream及子类FileInputStream、FileOutputStream;BufferedInpu
2011-06-27 18:09 19205Java将数据于目的地及来 ... -
线程综合文章
2011-06-27 10:48 1085http://lavasoft.blog.51cto.com/ ... -
由Java中的Set,List,Map引出的排序技巧
2011-06-24 14:18 2346一。关于概念: ... -
Date、String、Timestamp之间的转换
2011-03-20 16:59 2382public static Timestamp pars ...
相关推荐
java 对象的序列化与反序列化 java 对象的序列化与反序列化
Person 类有两个属性:name 和 age,其中 age 属性被标记为 transient,表示不参与序列化。我们创建了一个 Person 对象,并将其序列化到文件 person.ser 中。然后,我们从文件中反序列化对象,并打印反序列化后的...
什么是java序列化,如何实现java序列化?.pdf
什么是java序列化,如何实现java序列化?学习.pdf
什么是java序列化,如何实现java序列化?借鉴.pdf
java反序列化工具,覆盖jboss、weblogic、websphere。
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...
java对象 java序列化 java反序列化
java 的序列化与反序列化举例测试
极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。
java序列化和反序列化java序列化和反序列化java序列化和反序列化
java 常用序列化和反序列化框架使用demo ,java 常用序列化和反序列化框架使用demo
Java Json序列化与反序列化
本视频主要是介绍 java 序列化 将实体类本地序列化,这样以来可用用于小型 网站数据的存储。
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一...
java 序列化,java 序列化,java 序列化,java 序列化,java 序列化,java 序列化
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
一个基于java jaxb的序列化例子,非常简单易懂。jaxb是java标准的序列化方案,实现方式简单,是一种很好用的java xml 序列化反序列化方式
大家请看Java的序列化结构有不足的地方请指教也希望指出不足的地方。