- 浏览: 51520 次
- 性别:
- 来自: 待定
文章分类
最新评论
-
huhu1018:
有那么点点糊涂。。
Spring mail 实例+详解 -
12616383:
谢谢3楼的提醒。。以后要认真起来,嘿嘿
java_croe 学习笔记之新IO---java.nio 之内存映射文件 -
kuaiyuelaogong:
楼主的代码只是拷贝的,呵呵,调用的都是第一个方法,楼下的想测试 ...
java_croe 学习笔记之新IO---java.nio 之内存映射文件 -
fabulous:
inputStream
35169c9e
672耗时
Buff ...
java_croe 学习笔记之新IO---java.nio 之内存映射文件 -
mercyblitz:
模板利用了多态和抽象。
模板方法模式
一、串行化的概念和目的
1.什么是串行化
对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) 。串行化的主要任务是写出对象实例变量的数值。如果交量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。
2.串行化的目的
Java对象的单行化的目标是为Java的运行环境提供一组特性,如下所示:
1) 尽量保持对象串行化的简单扼要 ,但要提供一种途径使其可根据开发者的要求进行扩展或定制。
2) 串行化机制应严格遵守Java的对象模型 。对象的串行化状态中应该存有所有的关于种类的安全特性的信息。
3) 对象的串行化机制应支持Java的对象持续性。
4) 对象的串行化机制应有足够的 可扩展能力以支持对象的远程方法调用(RMI)。
5) 对象串行化应允许对象定义自身 的格式即其自身的数据流表示形式,可外部化接口来完成这项功能。
二、串行化方法
从JDK1.1开始,Java语言提供了对象串行化机制 ,在java.io包中,接口Serialization用来作为实现对象串行化的工具 ,只有实现了Serialization的类的对象才可以被串行化。
Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明该类参加串行化协议,而不需要实现任何特殊的方法。下面我们通过实例介绍如何对对象进行串行化。 (转自http://blog.csdn.net/sodino/archive/2008/12/21/3576147.aspx)
关于对象序列化和反序列化的顺序:反序列化是按照序列化的顺序进行读取的,所以反序列化的时候一定要按照序列化的顺序读取
自己写的列子
package twelve; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Date; import java.util.GregorianCalendar; /** * @Title ObjectFileTest.java * @description TODO * @author qinpeng * @date Aug 19, 2009 10:40:49 PM */ public class ObjectFileTest { public static void main(String[] args) { ObjectOutputStream out = null; ObjectInputStream in = null; Manager boss = new Manager("carl c", 8000, 1987, 12, 15); boss.setBonus(5000); Employee[] staff = new Employee[3]; staff[0] = boss; staff[1] = new Employee("harry", 5000, 1985, 8, 21); staff[2] = new Employee("tony", 4000, 1986, 6, 12); try { try { out = new ObjectOutputStream(new FileOutputStream( "employee.dat")); out.writeObject(staff); } finally { if (out != null) { out.close(); } } } catch (FileNotFoundException foundE) { foundE.printStackTrace(); System.err.print("employee.dat is not found"); } catch (IOException ioE) { ioE.printStackTrace(); System.err.print("IOException of main"); } try { try { in = new ObjectInputStream(new FileInputStream("employee.dat")); Employee[] newStaff = (Employee[]) in.readObject(); for (Employee e : newStaff) { System.out.println(e); } } finally { if (in != null) { in.close(); } } } catch (ClassNotFoundException classE) { classE.printStackTrace(); System.err.print("employee.dat is not found"); } catch (FileNotFoundException foundE) { foundE.printStackTrace(); System.err.print("employee.dat is not found"); } catch (IOException ioE) { ioE.printStackTrace(); System.err.print("IOException of main"); } } } class Employee implements Serializable { private String name; //private transient String name; private double salary; private Date hireDay; public Employee() { } public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar claendar = new GregorianCalendar(year, month - 1, day); } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } public String toString() { return getClass().getName() + "name=" + name + "---salary=" + salary + "---hirDay=" + hireDay; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Date getHireDay() { return hireDay; } public void setHireDay(Date hireDay) { this.hireDay = hireDay; } } class Manager extends Employee { private double bonus; public Manager(String n, double s, int year, int month, int day) { super(n, s, year, month, day); } public String toString() { return super.toString() + "bonus=" + bonus; } public double getSalary() { double baseSalay = super.getSalary(); return baseSalay + bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } }
这里当域没有用 transient 修饰的时候,该域作为对象的内容被保存起来。输出结果如下:
twelve.Managername=carl c---salary=8000.0bonus=5000.0
twelve.Employeename=harry---salary=5000.0
twelve.Employeename=tony---salary=4000.0
如果域 name 使用 transient 该域将不会进行保存
class Employee implements Serializable { //private String name; private transient String name; private double salary; private Date hireDay; ........
结果如下:
twelve.Managername=null---salary=8000.0bonus=5000.0
twelve.Employeename=null---salary=5000.0
twelve.Employeename=null---salary=4000.0
评论
否则修改过的类在反序列化的时候会报错的!!!
我也是刚学 对象流 和序列化,请前辈说得具体些,是我修改时要指定对象的 序列ID 是吧
否则修改过的类在反序列化的时候会报错的!!!
发表评论
-
我的 effective java -- 7.避免使用中介方法 finalizer
2012-07-23 20:44 9797.避免使用终结方法 finalizer 终结方法 ... -
我的 effective java -- 6.消除过期的对象引用
2012-07-23 19:51 12256.消除过期的对象引用 例子: public ... -
我的 effective java -- 5.避免创建不必要的对象.
2012-07-19 20:37 7985 避免创建不必要的对象 一般来说,最好能重 ... -
我的 effective java -- 4.通过私有构造器强化不可实例化的能力
2012-07-19 19:58 9954.通过私有化构造器强化不可实例化的能力 当编 ... -
我的 effective java -- 构建器
2012-05-21 20:51 943public class TestConstruc ... -
[转]java中byte转换int时为何与0xff进行与运算
2012-03-27 09:17 934在剖析该问题前请看如下代码public static ... -
关于java 的常量池
2012-02-18 23:34 1886常量:在编译初 ... -
java_croe 学习笔记之新IO---java.nio 之内存映射文件
2009-08-25 23:37 3195解释:将文件的一段区域映射到内存中,比传统的文件处理速度要快很 ... -
java_croe 学习笔记之对象流 (补充1 保存对象引用)
2009-08-20 23:11 1253保存对象引用: 基于前面的例子,我们现在假设每个Manage ... -
java--core 之 StringBuffer 和 StringBuilder 区别
2009-08-18 23:11 872java.lang.StringBuffer java ... -
java-core 学习笔记之异常处理篇
2009-08-06 23:24 8551 异常的分类:Error:java运行时系统的内部错误和资源 ... -
异常处理---你能找出几处问题
2009-08-06 23:04 828一共有6处问题,你能找出几处来? 1 OutputStrea ... -
core---java 之接口与内部类(持续更新)
2009-07-28 23:12 9671 接口是什么? 接口是用来描述类具备的功能,但是并不 ... -
core---java 之继承篇(持续更新)
2009-07-22 23:17 9121 类,超类,子类 子类是由超类继承而来,他具有超 ... -
java 类设计技巧
2009-07-22 21:51 9061 一定要将数据设计为私有。 2 一定要对数据初 ... -
java core--java 核心技术学习笔记----java.util.Arrays
2009-06-16 13:36 1197package com.zfsoft.monday; i ... -
学习 臧圩人的面试题详解后总结 及费解的问题
2009-04-22 00:06 9761 怎么样的对象在编译类时就放入字符串池中? ... -
关于 重写,重载,多态的精辟解释
2009-02-19 00:01 1053我哥们对 重载 ,重写,多态的 精辟解释: 对象:人 重写: ...
相关推荐
其次,Java的面向对象特性是其核心思想之一。书中深入讲解了类、对象、封装、继承、多态等面向对象的基本概念。理解类与对象的关系,如何通过类来抽象现实世界中的实体,如何利用继承实现代码的复用,以及多态性如何...
Hibernate作为一款强大的对象关系映射(ORM)工具,极大地简化了Java应用程序与数据库之间的交互。在这个过程中,我们将深入探讨Hibernate的核心概念、工作原理以及如何在实际项目中有效地运用Hibernate AIP。 首先...
在探讨CROE2E6300处理器与MSI 945P NEO3主板的超频方案之前,我们首先要理解几个关键概念和技术限制。E6300是一款基于Intel Core微架构的CPU,拥有良好的超频潜力,而945P NEO3主板则是基于Intel 945P芯片组设计,它...
标题“实时关注你CPU的温度CoreTemp”所指的是一个名为CoreTemp的小巧工具,它专门用于监测计算机中央处理器(CPU)的温度。CoreTemp是一款强大的系统监控软件,它能够提供准确、实时的CPU温度信息,帮助用户了解...
Creo Elements Pro 5.0 中文版是该软件的本地化版本,便于中文用户学习和使用。张克义作为该教程的主编,编写的《Creo Elements Pro 5.0中文版实例教程》是一本面向广大工程设计人员以及相关专业学生的技术指导书籍...
谷歌二维码生成 二维码,在网上很火,以前没有太多的关注,最近想了解一下,就找了些博客看一下,主要是关于Google的,下面分享一篇博客,写的很好了。
creo pdx10.0冲模专家 菜单汉化包 PDX10.0配合Creo4.0使用,一个简体汉化包分享给网友。 汉化方法: 压缩包解压后,将如图所示两个目录复制粘贴到PDX10.0目录下,启动Creo4.0即可显示中文简体的pdx界面了
次教程为creo3.0swf格式的电子书文件配套学习书籍之一,供学习爱好者方便学习
PTC_Creo_3.0_M040_Win64破解文件
学习和使用CROE通常需要一定的数学和编程背景,特别是线性代数、概率论和统计学知识。此外,熟悉金融市场的运作和投资原理也是必不可少的。如果你是初学者,建议从官方文档、教程或在线课程开始,逐步了解CROE的功能...
**Creo 模型拼接拉伸技巧详解** 在三维建模软件Creo中,模型拼接拉伸是一项重要的设计技巧,它可以帮助设计师构建复杂的几何形状。本教程将通过一个具体的实例来阐述如何运用这一技术。 ### 步骤一:创建外形特征 ...
- **应用场景**:在处理大型图纸时,如果需要批量删除对象,可以启用此选项以提高效率。 ##### allow_workpiece_silhouette - **说明**:此选项决定了工件是否可用于创建轮廓加工窗口。 - **值**: - `yes`:允许...
在C++编程中,捕获内存相关错误并生成dump文件是一项关键的技术...对于`DUMP_C++_dump_`这个主题,学习如何在C++代码中正确地捕获异常、设置调试钩子以及使用调试工具分析dump文件,是每一个高级C++开发者必备的技能。
Creo 3.0 表述式曲线知识点大全 Creo 3.0 表述式曲线是 Pro/Engineer(PROE)软件中的一个功能强大且灵活的设计工具,allows users to create complex curves using mathematical equations. 这种曲线可以应用于...
jchardet是一个基于Mozilla自动字符集探测算法的Java移植版,最初由Frank Tang开发,后来被移植到Java。这个库可以极大地帮助Java开发者解决编码识别问题。要使用jchardet,首先需要将其引入到项目中。然后,需要...
总结来说,这个压缩包提供了一整套钢管切割机的Creo 7.0设计资料,涵盖了从零部件到整体工程图的全面信息,是学习机械设计、了解切割机结构或进行定制设计的宝贵资源。通过解压并探索这些文件,用户可以深入了解Creo...
钣金折弯系数是钣金设计中的一个重要概念,它涉及到PROE等三维建模软件在处理钣金折弯和展平时的计算。在钣金加工过程中,材料在折弯时会发生内部拉伸或压缩,折弯系数就是用来描述这种变形的程度。...
在三维建模软件Creo 3.0中,配置文件(.prf文件)是控制程序行为和用户界面的关键元素。这些文件允许用户根据个人习惯和项目需求定制软件的各个方面,包括显示设置、单位系统、内存分配、启动选项等。...
让CREO设计效率与规范不断的提高 最近安装了PTC Creo Parametric 3.0,其配置选项与Creo Parametric 2.0有部分更改,研究PTC Creo® 3.0 Parametric 配置选项configoptions.pdf,再次整理一下自己正在使用的配置选项...