保存对象引用:
基于前面的例子,我们现在假设每个Manager 都拥有一个秘书Employee,而且一个或者多个Manager 拥有的是同一个秘书,我们不希望保存对象流时出现这种状况, 2个manager 一个秘书employee ,保存时,一共保存了3个employee。这样的话当希望对秘书employee 作出修改时,必须找出其他拷贝对象,再逐一修改。
我们希望做的是只保存和恢复秘书的一个拷贝,磁盘上的对象与内存中的对象布局完全一致。称其为 持久性 。想要达到这种效果,java 使用序列化的 方法,也就是 对象序列化:
1 所有保存到磁盘的对象都有一个序列
2 当向磁盘存储一个对象时,先检查是否有相同的对象存在
3 如果有相同对象,就只需要写入 已经存储对象序列号。如果没有,写入对象数据,生成序列号。
看下例子: 当修改秘书employee 时,manager 中引用的 employee 同样发生改变
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);
Employee harry = new Employee("harry", 5000, 1985, 8, 21);
boss.setBonus(5000);
boss.setSecretary(harry);
Employee[] staff = new Employee[3];
staff[0] = boss;
staff[1] = harry;
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();
newStaff[1].raiseSalary(10);
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;
}
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;
private Employee secretary ;
public Manager(String n, double s, int year, int month, int day) {
super(n, s, year, month, day);
secretary = null;
}
public String toString() {
return super.toString() + "bonus=" + bonus+"-------secretary's salary = "+secretary.getSalary();
}
public void setSecretary(Employee s) {
this.secretary = s;
}
public double getSalary() {
double baseSalay = super.getSalary();
return baseSalay + bonus;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
输出:
twelve.Managername=carl c---salary=8000.0bonus=5000.0-------secretary's salary = 5500.0
twelve.Employeename=harry---salary=5500.0
twelve.Employeename=tony---salary=4000.0
分享到:
相关推荐
《Java核心编程思想》是Java开发者的一本经典之作,它深入浅出地讲解了Java语言的核心概念和技术,旨在提升读者的编程思维和实战能力。这本书的内容涵盖了Java的基础语法、面向对象设计、异常处理、集合框架、多线程...
仅用于Creo软件。Creo每次保存不会替换源文件,这个可以自己在软件设置的,不用我的这purge.exe程序,不会软件设置操作或设置的不成功的需要的人使用。
Hibernate作为一款强大的对象关系映射(ORM)工具,极大地简化了Java应用程序与数据库之间的交互。在这个过程中,我们将深入探讨Hibernate的核心概念、工作原理以及如何在实际项目中有效地运用Hibernate AIP。 首先...
"69M2V1.zip" 是一个压缩文件,其中包含了一个或多个与"CROE"相关的文件。CROE通常指的是"Computational Risk and Optimization Engine",这是一个在金融、工程和其他领域中用于处理复杂风险分析和优化问题的计算...
在探讨CROE2E6300处理器与MSI 945P NEO3主板的超频方案之前,我们首先要理解几个关键概念和技术限制。E6300是一款基于Intel Core微架构的CPU,拥有良好的超频潜力,而945P NEO3主板则是基于Intel 945P芯片组设计,它...
随着处理器负载的增加,核心温度也会随之升高。过高的温度可能会导致处理器降频,甚至触发保护机制,导致电脑重启。使用CoreTemp这类工具,用户可以确保处理器温度始终保持在一个安全的范围内,避免因过热带来的性能...
谷歌二维码生成 二维码,在网上很火,以前没有太多的关注,最近想了解一下,就找了些博客看一下,主要是关于Google的,下面分享一篇博客,写的很好了。
Creo Elements Pro 5.0 中文版是该软件的本地化版本,便于中文用户学习和使用。张克义作为该教程的主编,编写的《Creo Elements Pro 5.0中文版实例教程》是一本面向广大工程设计人员以及相关专业学生的技术指导书籍...
1. 首先,创建一个名为DTM1的基准平面,选择模型底面并向上偏移2mm。 2. 使用DTM1基准面作为草绘平面,绘制弧形截面图形。 3. 再次执行拉伸操作,选择“实体剪材料”方式,设置深度为“穿透所有”,这样就形成了中间...
creo pdx10.0冲模专家 菜单汉化包 PDX10.0配合Creo4.0使用,一个简体汉化包分享给网友。 汉化方法: 压缩包解压后,将如图所示两个目录复制粘贴到PDX10.0目录下,启动Creo4.0即可显示中文简体的pdx界面了
次教程为creo3.0swf格式的电子书文件配套学习书籍之一,供学习爱好者方便学习
在C++编程中,捕获内存相关错误并生成dump文件是一项关键的技术...对于`DUMP_C++_dump_`这个主题,学习如何在C++代码中正确地捕获异常、设置调试钩子以及使用调试工具分析dump文件,是每一个高级C++开发者必备的技能。
PTC_Creo_3.0_M040_Win64破解文件
18. Rhodonea 曲线采用笛卡尔坐标系方程:theta=t*360*4 x=25+(10-6)*cos(theta)+10*cos((10/6-1)*theta) y=25+(10-6)*sin(theta)-6*sin((10/6-1)*theta) 这种曲线用于设计 Rhodonea 曲线形零件,如 Rhodonea 曲线...
- **应用场景**:在处理大型图纸时,如果需要批量删除对象,可以启用此选项以提高效率。 ##### allow_workpiece_silhouette - **说明**:此选项决定了工件是否可用于创建轮廓加工窗口。 - **值**: - `yes`:允许...
通过设置“AUTO_SAVE_INTERVAL”可以定时自动保存文件,防止因意外情况丢失工作。同时,“BACKUP_FILES=YES”可开启自动备份功能,保护您的工作安全。 **七、显示和图形设置** 配置文件可以调整模型渲染质量,如...
= -1) { if (isAscii) isAscii = det.isAscii(buf,len); if (!isAscii && !done) done = det.DoIt(buf,len, false); } det.DataEnd(); if (isAscii) { System.out.println("CHARSET = ASCII"); found = true ;...
而K系数,作为这个公式中的一个关键变量,是一个范围在0到1之间的参数,用于描述材料在折弯时的抵抗程度。K系数越大,表示材料的弹性模量越大,抵抗变形的能力越强,折弯时的拉伸或压缩程度越小。 为了更准确地计算...
总结来说,这个压缩包提供了一整套钢管切割机的Creo 7.0设计资料,涵盖了从零部件到整体工程图的全面信息,是学习机械设计、了解切割机结构或进行定制设计的宝贵资源。通过解压并探索这些文件,用户可以深入了解Creo...