- 浏览: 612675 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (240)
- 程序员数学/线性代数(Linear Algebra) (2)
- 程序员数学/微积分(Calculus) (6)
- 机器学习(Machine Learning) (5)
- JAVA SE (63)
- JAVA EE (14)
- 数据库技术 (26)
- struts (4)
- 软件设计/设计模式 (0)
- ibatis (2)
- XML (4)
- 领域建模 (0)
- 数据资源共享 (1)
- 软件工程 (11)
- 技术以外 (6)
- 面向对象 (2)
- 科学数据共享 (1)
- 资源 (7)
- WEB2.0 (11)
- 电子商务 (10)
- 算法、数据结构、数学 (10)
- LAMP (1)
- 杂谈 (12)
- C语言 (7)
- 程序设计思想 (3)
- 读书和笔记 (1)
- 生活 健身 养生 (5)
- WEB UI (2)
- eclipse (2)
- 项目管理 (7)
- oracle (5)
- linux (1)
- webGIS (6)
最新评论
-
TimePower:
OK~终于明白了~~
参数(parameter)和属性(Attribute)的区别 -
OnTheRoad_lee:
不错,正式我想要的东西,一直不明白序列化是什么?有什么用?至此 ...
我对Java Serializable(序列化)的理解和总结 -
EchoZhouYou:
好久不上这,找这本书时发现这一篇,特意登录来赞一下
《程序设计语言——实践之路》读后感 -
yong7356:
学习一下Serializable
我对Java Serializable(序列化)的理解和总结 -
dengjm_2012:
写得不错!
我对Java Serializable(序列化)的理解和总结
Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。
要想序列化对象,你必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这时,你就能用writeObject( )方法把对象写入OutputStream了。
writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。
读的时候,你得把 InputStream嵌到ObjectInputStream里面,然后再调用readObject( )方法。不过这样读出来的,只是一个Object的reference,因此在用之前,还得先下传。readObject 方法负责从流中读取并还原类字段。它可以调用 in.defaultReadObject 来调用默认机制,以还原对象的非静态和非瞬态字段。
defaultReadObject 方法使用流中的信息来分配流中通过当前对象中相应命名字段保存的对象的字段。这用于处理类发展后需要添加新字段的情形。该方法本身不需要涉及属于其超类或 子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。
看一个列子:
class tree implements java.io.Serializable {
public tree left;
public tree right;
public int id;
public int level;
private static int count = 0 ;
public tree( int depth) {
id = count ++ ;
level = depth;
if (depth > 0 ) {
left = new tree(depth - 1 );
right = new tree(depth - 1 );
}
}
public void print( int levels) {
for ( int i = 0 ; i < level; i ++ )
System.out.print( " " );
System.out.println( " node " + id);
if (level <= levels && left != null )
left.print(levels);
if (level <= levels && right != null )
right.print(levels);
}
public static void main (String argv[]) {
try {
/**/ /* 创建一个文件写入序列化树。 */
FileOutputStream ostream = new FileOutputStream( " tree.tmp " );
/**/ /* 创建输出流 */
ObjectOutputStream p = new ObjectOutputStream(ostream);
/**/ /* 创建一个二层的树。 */
tree base = new tree( 2 );
p.writeObject(base); // 将树写入流中。
p.writeObject( " LiLy is 惠止南国 " );
p.flush();
ostream.close(); // 关闭文件。
/**/ /* 打开文件并设置成从中读取对象。 */
FileInputStream istream = new FileInputStream( " tree.tmp " );
ObjectInputStream q = new ObjectInputStream(istream);
/**/ /* 读取树对象,以及所有子树 */
tree new_tree = (tree)q.readObject();
new_tree.print( 2 ); // 打印出树形结构的最上面 2级
String name = (String)q.readObject();
System.out.println( " \n " + name);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
最后结果如下:
node 0
node 1
node 2
node 3
node 4
node 5
node 6
LiLy is 惠止南国
可以看到,在序列化的时候,writeObject与readObject之间的先后顺序。readObject将最先write的object read出来。用数据结构的术语来讲就姑且称之为先进先出吧!
在序列化时,有几点要注意的:
1:当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
2:如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
3:如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化
还有我们对某个对象进行序列化时候,往往对整个对象全部序列化了,比如说类里有些数据比较敏感,不希望序列化,一个方法可以用transient来标识,另一个方法我们可以在类里重写
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException
这二个方法!
示例:
class ObjectSerialTest
{
public static void main(String[] args) throws Exception
{
Employee e1 = new Employee( " zhangsan " , 25 , 3000.50 );
Employee e2 = new Employee( " lisi " , 24 , 3200.40 );
Employee e3 = new Employee( " wangwu " , 27 , 3800.55 );
FileOutputStream fos = new FileOutputStream( " employee.txt " );
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(e1);
oos.writeObject(e2);
oos.writeObject(e3);
oos.close();
FileInputStream fis = new FileInputStream( " employee.txt " );
ObjectInputStream ois = new ObjectInputStream(fis);
Employee e;
for ( int i = 0 ;i < 3 ;i ++ )
{
e = (Employee)ois.readObject();
System.out.println(e.name + " : " + e.age + " : " + e.salary);
}
ois.close();
}
}
class Employee implements Serializable
{
String name;
int age;
double salary;
transient Thread t = new Thread();
public Employee(String name, int age, double salary)
{
this .name = name;
this .age = age;
this .salary = salary;
}
private void writeObject(java.io.ObjectOutputStream oos) throws IOException
{
oos.writeInt(age);
oos.writeUTF(name);
System.out.println( " Write Object " );
}
private void readObject(java.io.ObjectInputStream ois) throws IOException
{
age = ois.readInt();
name = ois.readUTF();
System.out.println( " Read Object " );
}
}
发表评论
-
Drools JBPM区别
2011-03-21 18:02 1791参考资料: 1、http://www.simpleframew ... -
推荐web开发教材
2009-11-25 13:00 1413大家能否给推荐一本 用JAVA语言相关的WEB开发方面的教材。 ... -
JAVA 线程编程 ----两个线程程序
2009-11-20 13:08 2114Java的内置线程支持 关 ... -
JAVA 线程编程 ----什么时候多线程可能不好(When Multiple Threads Might Not Be Good)
2009-11-13 12:59 1241设计程序时候创建更多的线程不总是一个好主意。线程不是免费的;它 ... -
JAVA 线程编程 ----为什么要用多线程(Why Use Multiple Thread)
2009-11-11 15:51 3365许多情况下,在一个程 ... -
JAVA 线程编程 ----线程介绍
2009-11-10 14:59 1252概述 浏览网页时,当 ... -
DataSource data source JNDI之间的关系
2009-09-16 17:01 2366data source :所谓data source就 ... -
字符,字节和编码三者的关系
2009-06-03 23:17 0http://www.regexlab.com/zh/enco ... -
jasperreport
2009-05-04 14:17 0http://www.docstoc.com/docs/213 ... -
iReport设计报表以Excel格式导出时注意的问题
2009-04-23 15:08 7209刚开始使用iReport工具,没想到就遇到了问题: 在以Exc ... -
到主机 的 TCP/IP 连接失败,达到最大连接数
2009-04-23 14:35 4429问题描述: _______________ ... -
Acegi框架介绍
2009-03-30 23:57 1498转自:这里 灰色字体 ... -
对语言的一些理解
2008-05-06 17:54 1457语言的本质 包 ... -
HOW TO DESIGN PROGRAMS
2008-04-21 09:55 1699http://www.htdp.org ·前言 向儿童传 ... -
AOP 入门好文章
2008-04-18 18:42 1445http://dev.rdxx.com/Java/2005-0 ... -
Head First JSP &Servlet读后感------chapt01
2008-01-02 22:50 2045Web程序和普通的GUI程序 ... -
JNDI资料整理
2007-12-26 16:38 1307******************************* ... -
JDBC初级应用实例(二) 转
2007-12-25 09:35 1232转自:http://blog.csdn.net/axman/a ... -
JDBC初级应用实例(一) 转
2007-12-25 09:25 1437转自:http://blog.csdn.net/a ... -
JDBC基础(四)转
2007-12-25 09:07 1279转自:http://blog.csdn.net/axman/a ...
相关推荐
理解并熟练掌握这一技术,对提升Java开发能力具有重要意义。在实际应用中,要根据具体需求来选择合适的序列化库,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro等,它们提供了更高效、更灵活的序列化...
### Java Serializable(序列化)的理解和总结 #### 一、序列化的定义与目的 序列化是一种将对象的状态转换为可以存储或传输的形式的过程。在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被...
Java序列化是Java平台提供的一种持久化机制,它允许我们将一个对象的状态转换成字节流,以便存储到磁盘上或者在网络中进行传输。...理解并熟练运用序列化技术,能帮助我们更好地设计和实现复杂的Java应用程序。
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
首先,让我们理解`Serializable`接口。任何实现了`Serializable`接口的类的对象都可以被序列化。在Java中,通过实现此接口,对象的实例字段将被转换为字节流,这允许将对象保存到磁盘或在网络上传输。例如: ```...
本篇将详细讲解两种常见的序列化方式:Serializable和Parcelable,并通过实例代码来加深理解。 1. **Serializable接口** `Serializable` 是Java标准库提供的一种简单的序列化方式,位于`java.io`包下。任何实现了`...
在Java编程语言中,序列化(Serialization)是一种重要的机制,...`MySerializable.java`和`Product.java`这两个类的示例代码可能就是实际应用中的具体实现,通过学习和实践这些示例,可以加深对Java序列化机制的理解。
Java 串行化主要通过实现`java.io.Serializable`接口来实现,同时也提供了`java.io.Externalizable`接口来提供更细粒度的控制。 **一、Serializable接口** `Serializable`是Java中的一个标记接口,没有包含任何方法...
在Android应用开发中,Intent是连接各个组件(Activity、Service、BroadcastReceiver)的重要桥梁,它不仅可以携带基本...在提供的Android_project_Serializable项目中,你可以找到相关的代码示例,通过实践加深理解。
在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是实现对象持久化的关键。本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含...
### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...
Java序列化(Serializable)是Java...总的来说,Java序列化是一个强大但需要谨慎使用的工具,正确理解和使用序列化可以帮助我们实现对象的持久化和跨进程通信,同时也需要关注其中的安全隐患,以确保应用程序的安全性。
本文将深入探讨“事物学习笔记二”中关于Java事务的理解,旨在帮助读者更好地掌握这一关键概念。 首先,事务(Transaction)是数据库操作的基本单位,它确保一组数据库操作要么全部成功,要么全部失败,从而保证...
这本书旨在帮助开发者进一步提升对Java语言的理解和应用能力。 1. **多线程**:Java提供了丰富的API来支持多线程编程,如`Thread`类、`Runnable`接口和`ExecutorService`等。理解线程的生命周期、同步机制(如`...
Android中的Serializable序列化是开发者常用的数据处理工具,理解其工作原理和应用场景有助于优化代码并避免潜在的问题。然而,在实际开发中,我们还需要根据具体需求和性能考虑,选择最合适的序列化策略。
深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字) Java序列化和反序列化是Java虚拟机中的一种重要机制,它们可以将Java对象转换为二进制数据,然后...
* 使用Java中的Serializable接口来实现实体类的序列化。 * 了解如何使用Java中的getter和setter方法来访问和修改实体类的成员变量。 九、操作类的设计 * 设计操作类,例如ReaderDao和BookDao类。 * 使用Java中的...
在IT行业中,数据库管理和数据操作是至关重要的环节。MySQL是一个广泛应用的关系型数据库管理系统,而Java是一种广泛用于开发后端...理解这一过程并掌握相关的工具和最佳实践,对于提升Java后端开发的能力至关重要。
RMI对象通过序列化的方式在网络上进行传输,这意味着它们必须实现java.io.Serializable接口。序列化是将对象状态转换为可以存储或传输的格式的过程,而反序列化则是将这些格式重新转化为对象的过程。 JNDI是Java的...