- 浏览: 469150 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
谢谢你的祝福:
特地登陆上来感谢一下楼主,解决问题。
ORA-04098: 触发器无效且未通过重新验证问题 -
fuqiangjava:
写的不错 解决了自己的一个问题 谢谢了
ORA-00001:unique constraint (oracle 10g) -
hujinhuhujinhu:
make ...我有1.6.23
MyEclipse6.5安装自动提示功能的jQuery插件步骤 -
fool2011:
学习下,博主
JFreeChart类生成折线图的Java源代码 -
814687491:
你不是说的JQUERY吗?
MyEclipse6.5安装自动提示功能的jQuery插件步骤
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是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的对象写出(即保存其状态),要恢复的话则用输入流。
例子:import java.io.*;
public class Test {
public static void main(String[] args) {
Employee harry = new Employee("Harry Hacker", 50000);
Manager manager1 = new Manager("Tony Tester", 80000);
manager1.setSecretary(harry);
Employee[] staff = new Employee[2];
staff[0] = harry;
staff[1] = manager1;
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("employee.dat"));
out.writeObject(staff);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"employee.dat"));
Employee[] newStaff = (Employee[]) in.readObject();
in.close();
/**
* 通过harry对象来加薪 将在secretary上反映出来
*/
newStaff[0].raiseSalary(10);
for (int i = 0; i < newStaff.length; i++)
System.out.println(newStaff[i]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Employee implements Serializable {
public Employee(String n, double s) {
name = n;
salary = s;
}
/**
*
* 加薪水
*
*/
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
public String toString() {
return getClass().getName() + "[name = " + name+ ",salary = " + salary+ "]";
}
private String name;
private double salary;
}
class Manager extends Employee
{
public Manager(String n, double s)
{
super(n, s);
secretary = null;
}
/**
*
* 设置秘书
*
*/
public void setSecretary(Employee s)
{
secretary = s;
}
public String toString()
{
return super.toString()+ "[secretary = " + secretary+ "]";
}
// secretary代表秘书
private Employee secretary;
}
在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义时给它加上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类中的一个数据字段,并演示如何将其序列化!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;
}
发表评论
-
Ascii 代码表
2010-03-16 11:49 1677Ascii 代码表 Ascii 0 {Nulo, Sem So ... -
MyEclipse中SVN的安装
2010-01-29 10:42 2646MyEclipse 6.X 6.x的操作比 ... -
VMware5.5的安装步骤(图)
2010-01-22 16:16 2484VMware Workstation 5.5的安装步骤: ... -
JAVA的单例设计模式
2010-01-20 17:30 812public class Book { private ... -
JFileChooser文件类型gif和jpg的过滤
2010-01-13 21:42 8965import java.awt.*; import java ... -
强烈推荐一款非常好用的java反编译工具----纯净,绿色,营养,健康
2010-01-11 13:17 8911一款非常好用的java反编译工具----纯净的,绿色的,营养 ... -
十六进制转成十进制
2010-01-04 14:13 1730String s = "7a"; ... -
Tomcat启动时自动加载Servlet
2009-12-31 11:29 7639想实现这样的功能: 1. Tomcat启动时 ... -
轻轻松松将web工程制作成exe安装包的工具--------smart install maker
2009-12-28 17:14 4541smart install ... -
exe4j使用总结
2009-12-25 22:51 3245一.环境。 JDK版本:JDK 1.6 ... -
Java.lang.RuntimeException: No application id has been found
2009-12-16 10:35 4705今天安装MyEclipse6.5后, ... -
windows系统下JDK1.6环境变量配置
2009-11-17 18:04 10640一、JDK1.6下载 ... -
从Java类库看设计模式(2)
2009-10-24 17:36 901Command模式用来封装一个 ... -
从Java类库看设计模式(1)
2009-10-24 17:31 993软件模式的概念现在比 ... -
Singleton 模式 在 Java连接池中的应用
2009-10-22 21:27 1803程序中经常有这样的要 ... -
16天学完java
2009-09-08 10:12 1728Day 01一、 从面向过 ... -
Java内存管理的小技巧
2009-08-07 12:59 1031java做的系统给人的印象是什么?占内存!说道这句话就会有N多 ... -
程序员的基本原则
2009-08-07 12:51 854金蝶中间件公司CTO袁红岗 不知不觉做软件已经做了十 ... -
Java笔试题目汇总122题
2009-08-07 12:42 9701、面向对象的特征有哪 ... -
追MM与Java的23种设计模式
2009-08-07 12:37 916我在Java论坛看到这篇文章,作者以轻松的语言比喻 ...
相关推荐
Java序列化机制(2)- serialVersionUID 实验 http://blog.csdn.net/suileisl/article/details/16991753
学习Java序列化,里面包含一份PPT以及相应的源码演示
java序列化和反序列化java序列化和反序列化java序列化和反序列化
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
java反序列化工具,覆盖jboss、weblogic、websphere。
大家请看Java的序列化结构有不足的地方请指教也希望指出不足的地方。
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
java 序列化详细解释 很详细 适用于高级软件开发者
java 对象的序列化与反序列化 java 对象的序列化与反序列化
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
这是Java 序列化(Serializable)实现的一个例子,例子是显示文件的读写的。
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是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序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化
java 的序列化与反序列化举例测试
java 常用序列化和反序列化框架使用demo ,java 常用序列化和反序列化框架使用demo
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
java对象 java序列化 java反序列化
java 序列化,java 序列化,java 序列化,java 序列化,java 序列化,java 序列化