Java 对象流学习 java核心技术小例子

来源:互联网 发布:淘宝高仿鞋店铺 2016 编辑:程序博客网 时间:2024/05/16 03:18

1,要实现对象流的读写,所有的类要实现Serializable接口,Serializable是一个空接口,没有具体方法,可以提供唯一序列号


2,将对象生成的文件以16进制格式打开,了解下深层次的逻辑,就发现其实对象流也没那么神奇。

例如:开头四位ac ed 00 05 其中ac ed 是固定的头 00 05是  版本号。原理就是将对象中的内容按照设定好的规则编码,然后再解析。

值得注意的是:还原的对象依然保存着地址空间的引用。 如下面的例子读取的新对象 newStaff[0]改变,对应的对她的引用也都会改变。


3,对象的读写可以理解成对内存的记录




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;


public class ObjectStringTest 
{


public static void main(String[] args) 
{
Employee harry = new Employee("秘书",50000,1989,10,1);

Manager car1 = new Manager("领导car1",80000,1987,12,15);
car1.setSecretary(harry);

Manager tony = new Manager("领导tony",40000,1990,3,15);
tony.setSecretary(harry);

Employee[] staff = new Employee[3];
staff[0] = harry;
staff[1] = car1;
staff[2] = tony;
staff[0].setName("新秘书");
for(Employee e:staff)
{
System.out.println(e);
}
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.dat"));
out.writeObject(staff);
out.close();

ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.dat"));
Employee[] newStaff = (Employee[])in.readObject();
in.close();

//newStaff[1].raiseSalary(10); 有新的地址孔家
//重新读取后   由于java的序列化   对象共享同一地址空间
newStaff[0].setName("秘书1");
for(Employee e:newStaff)
{
System.out.println(e);
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


}


//Serializable
class Employee implements Serializable
{
public Employee()
{
}

public Employee(String n,double s,int year ,int month,int day)
{
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year,month - 1,day);
hireDay = calendar.getTime();
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent/100;

salary += raise;
}

private String name;
private Double salary;//薪水
private Date hireDay;
public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public Double getSalary() {
return salary;
}


@Override
public String toString() {
return "Employee [hireDay=" + hireDay + ", name=" + name + ", salary="
+ 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
{
public Manager(String n,double s,int year ,int month,int day)
{
super(n,s,year,month,day);
secretary = null;
}

private Employee secretary;


public Employee getSecretary() {
return secretary;
}


public void setSecretary(Employee secretary) {
this.secretary = secretary;
}


@Override
public String toString() {
return "Manager [secretary=" + secretary + "]";
}
}
0 0