Java实现对象序列化的应用
实现对象序列化的具体应用是什么?
1.可以将对象信息保存到任何字节输出流中,当然不一定在文件中;
2.可以从任何字节输入流中读取可能提供的序列化对象;
3.实现Serializable接口,使用transient关键字;
4.使用对象数组处理;
——–个人信息管理系统: 约800行代码!
//1.实现系统操作对象:Person>
// 定义Info接口
package com.project.person;
// 接口实现序列化,当序列化接口以后版本增加内容时,不必逐一更改实现该接口的类,接口和抽象类一样可以不必实现抽象方法;
public interface Info extends java.io.Serializable // 表示人的各种信息
{
// 空实现的接口 称为 标识接口;
}
// 定义Whois类
package com.project.person;
public class Whois implements Info // 人的基本信息
{
private String name;
private int age;
public Whois()
{
super(); // 默认
}
public Whois(String name, int age)
{
super(); // 明确调用Object的默认构造
this.name = name;
this.age = age;
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return this.age;
}
public void setAge(int age)
{
this.age = age;
}
public String toString() // 覆写父类的方法
{
return “姓名:” + this.name + ” 年龄:” + this.age;
}
}
// 定义Contact类
package com.project.person;
public class Contact implements Info // 表示联系方式
{
private String address = null;
private String zipCode = null;
public Contact()
{
super();
}
public Contact(String address, String zipCode)
{
this.address = address;
this.zipCode = zipCode;
}
public String getAddress()
{
return this.address;
}
public void setAddress(String address)
{
this.address = address;
}
public String getZipCode()
{
return this.zipCode;
}
public void setZipCode(String zipCode)
{
this.zipCode = zipCode;
}
public String toString() // 覆写父类方法
{
return “地址:” + this.address + ” 区号:” + this.zipCode;
}
}
// 定义Person
/*
一个人的信息分为:基本信息,和联系方式;
实现一个类既能操作人的基本信息,又能操作联系方式;
*/
package com.project.person;
public class Person
{
private T info;
public Person()
{
this.info = null;
}
public Person(T info)
{
this.info = info;
}
public T getInfo()
{
return this.info;
}
public void setInfo(T info)
{
this.info = info;
}
public String toString() // 序列化时调用
{
return this.info.toString(); // 返回当前属性:info类的当前实例的属性
}
public static void main(String[] args)
{
String name = “张三”;
int age = 30;
Person
perWhois.setInfo(new Whois(name, age)); // 给实例赋值
System.out.println(perWhois.getInfo());
String address = “北京”, zipCode = “10000”;
Person
perContact.setInfo(new Contact(address, zipCode));
System.out.println(perContact.getInfo());
}
}
/*
administrator@xu-desktop:~$ java com.project.person.Person
姓名:张三 年龄:30
地址:北京 区号:10000
*/
// 定义PersonInfo类:
package com.project.person;
public class PersonInfo implements java.io.Serializable // 序列化对象
{
private Person
private Person
public PersonInfo()
{
this.baseInfo = new Person
this.contact = new Person
}
// 以下方法满足不同的访问要求
public Person
{
return this.baseInfo; // 获取基本信息
}
public Person
{
return this.contact; // 获取联系方式
}
public String getName() // 获取姓名
{
return this.getBaseInfo().getInfo().getName();
}
public int getAge() // 获取年龄
{
return this.getBaseInfo().getInfo().getAge();
}
public String getAddress() // 获取地址
{
return this.getContact().getInfo().getAddress();
}
public String getZipCode() // 获取邮编
{
return this.getContact().getInfo().getZipCode();
}
// 以下方法用于满足不同修改要求
public void setName(String name) // 设置姓名
{
this.getBaseInfo().getInfo().setName(name);
}
public void setAge(int age) // 设置年龄
{
this.getBaseInfo().getInfo().setAge(age);
}
public void setAddress(String address) // 设置地址
{
this.getContact().getInfo().setAddress(address);
}
public void setZipCode(String zipCode) // 设置邮编
{
this.getContact().getInfo().setZipCode(zipCode);
}
public void setBaseInfo(String name, int age)
{
this.baseInfo.getInfo().setName(name); // 设置姓名
this.baseInfo.getInfo().setAge(age); // 设置年龄
}
public void setContact(String address, String zipCode)
{
this.contact.getInfo().setAddress(address); // 设置地址
this.contact.getInfo().setZipCode(zipCode); // 设置邮编
}
public String toString() // 覆写方法
{
return this.baseInfo.toString() + ” ; ” + this.contact.toString();
}
public boolean equals(Object obj) // 覆写
{
return true;
}
}
//2.实现文件操作:FileOpertate
package com.project.fileoperate;
import java.io.*;
public class FileOperate // 专门用来保存、读取文件
{
private String path = null; // 对象存储路径
public FileOperate(String path)
{
this.path = path;
}
public boolean save(Object obj) throws Exception
{
boolean flag = false; // 保存状态
OutputStream out = null; // 声明输出流
ObjectOutputStream oos = null; // 声明对象输出流
try
{
out = new FileOutputStream(new File(this.path)); // 实例化字节输出流对象
oos = new ObjectOutputStream(out); // 实例化对象输出流对象
oos.writeObject(obj); // 写入数据
flag = true; // 修改状态
}
catch (Exception e)
{
throw e; // 将异常抛出给主调者处理
}
finally
{
if (out != null)
{
oos.close(); // 关闭输出流
}
}
return flag;
}
public Object load() throws Exception
{
Object obj = null; // 接收读取对象
ObjectInputStream ois = null; // 声明对象输入流
InputStream in = null; // 声明字节输入流
try
{
in = new FileInputStream(new File(this.path));
ois = new ObjectInputStream(in); // 实例化对象输入流
obj = ois.readObject(); // 读取序列化对象
}
catch (Exception e)
{
throw e; // 抛出异常
}
finally
{
ois.close();// 关闭输入流
}
return obj; // 返回读取的对象
}
}
//3.实现数据输入接收:InputData
package com.project.inputdata;
// ——————————————————————————————————————InputData类——————————————————————————————————————————
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class InputData // 实现类型数据输入
{
private BufferedReader buf = null; // 读取数据
public InputData()
{
this.buf = new BufferedReader(new InputStreamReader(System.in)); // 接收标准输入;
}
public String getString(String info) // 获取输入的字符串形式
{
String temp = null; // 接收输入数据
System.out.println(info); // 打印提示信息
try
{
temp = this.buf.readLine(); // 读取标准输入以字符串形式返回;
}
catch (IOException e)
{
e.printStackTrace();
}
return temp;
}
public int getInt(String info, String err) // 获取整型的输入数据
{
int temp = 0; // 接收输入
String str = null; // 获取字符串信息
boolean flag = true; // 监视输入
while (flag)
{
str = this.getString(info); // 打印提示,并等待接收字符串信息
if (str.matches(“^\\d+$”)) // 判断是数字组成
{
temp = Integer.parseInt(str); // String–>Integer–>int
flag = false; // 结束循环
}
else
{
System.out.println(err); // 打印错误信息
}
}
return temp;
}
public float getFloat(String info, String err) // 获取输入的float型小数
{
float temp = 0.0f; // 接收输入
String str = null; // 获取字符串信息
boolean flag = true; // 监视输入
while (flag)
{
str = this.getString(info); // 打印提示,并等待接收字符串信息
if (str.matches(“^\\d+.?\\d+f$”)) // 判断是数字组成
{
temp = Float.parseFloat(str); // String–>Float–>float
flag = false; // 结束循环
}
else
{
System.out.println(err); // 打印错误信息
}
}
return temp;
}
public Date getDate(String info, String err) // 获取输入的Date型日期
{
Date temp = null; // 接收输入
String str = null; // 获取字符串信息
boolean flag = true; // 监视输入
while (flag)
{
str = this.getString(info); // 打印提示,并等待接收字符串信息
if (str.matches(“^\\d{4}-[0-1]\\d-[0-3]\\d$”)) // 判断是数字组成
{
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”); // 实例化日期风格
try
{
temp = sdf.parse(str); // String–>Date
}
catch (ParseException e)
{
e.printStackTrace();
}
flag = false; // 结束循环
}
else
{
System.out.println(err); // 打印错误信息
}
}
return temp;
}
}
//4.实现内部逻辑:菜单生成、菜单操作
// 定义MenuOperate类
package com.project.operate;
import com.project.inputdata.*;
import com.project.fileoperate.*;
import com.project.person.*;
import java.io.File;
//—————————————————————————————————————————————Menu操作类——————————————————————————————————
abstract class MenuOperate // 将实现主要逻辑
{
protected String title = null; // 菜单标题
protected static final String filePath = File.separator +
“home” + File.separator +
“administrator” + File.separator + “info.dat”; // 数据保存路径
protected InputData input = null; // 获取输入
protected FileOperate fileOperate = null;// 操作文件的保存、读取
public MenuOperate()
{
// 空实现
}
public String getTitle() // 获取菜单
{
return this.title;
}
public InputData getInput()
{
this.input = new InputData(); // 实例化数据获取类
return this.input;
}
public FileOperate getFile()
{
this.fileOperate = new FileOperate(this.filePath); // 实例化文件操作类
return this.fileOperate;
}
public void setTitle(String title)
{
this.title = title; // 设置菜单
}
public abstract void operate(); // 菜单操作
public void add() // 增加
{
// 输入人的信息:name,age,ID,address,phone,…
String name = this.getInput().getString(“请输入姓名:”);
int age = this.getInput().getInt(“请输入年龄:”, “输入非法!”);
String address = this.getInput().getString(“请输入地址:”);
String zipCode = this.getInput().getString(“请输入邮编:”);
// 实例化Person信息对象;
PersonInfo perInfo = new PersonInfo(); // 实例化个人信息
perInfo.setBaseInfo(name, age); // 设置基本信息
perInfo.setContact(address, zipCode); // 设置联系方式
// 保存对象
try
{
this.getFile().save(perInfo); // 保存数据
System.out.println(“数据增加成功!”);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void delete()// 删除
{
try
{
this.getFile().save(null); // 清空数据
System.out.println(“数据删除成功!”);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void alter() // 修改
{
boolean flag = false;
while (true)
{
PersonInfo perInfo = null; // 声明个人信息
try
{
if (this.getFile().load() != null) // 存在数据才读取
{
perInfo = (PersonInfo)this.getFile().load(); // 读入信息
}
else // 没有数据退出当前操作
{
System.out.println(“当前数据为空!请增加数据!”);
break; // 跳出循环
}
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(“请选择您要修改的属性:”);
String sel = this.getInput().getString(“[1].姓名、[2].年龄、[3].地址、[4].邮编”);
if (“1”.equals(sel)) // 修改姓名
{
String name = this.getInput().getString(“请输入新的姓名:”);
perInfo.setName(name); // 设置姓名
flag = true;
}
else if (“2”.equals(sel)) // 修改年龄
{
int age = this.getInput().getInt(“请输入新的年龄:”, “输入非法!”);
perInfo.setAge(age);
flag = true;
}
else if (“3”.equals(sel)) // 修改地址
{
String address = this.getInput().getString(“请输入新的地址:”);
perInfo.setAddress(address);
flag = true;
}
else if (“4”.equals(sel)) // 修改邮编
{
String zipCode = this.getInput().getString(“请输入新的邮编:”);
perInfo.setZipCode(zipCode);
flag = true;
}
else
{
System.out.println(“请输入对应的数字!”);
}
if (flag == true)
{
try
{
this.getFile().save(perInfo); // 保存修改好的数据
System.out.println(“数据修改成功!”);
}
catch (Exception e)
{
e.printStackTrace();
}
sel = this.getInput().getString(“您是否还要修改其他数据:(y/n?)”);
if (“y”.equals(sel) || “Y”.equals(sel))
{
flag = false;
}
else if (“n”.equals(sel) || “N”.equals(sel))
{
break; // 退出循环
}
else
{
System.out.println(“请输入正确选择:( y : 修改, n : 退出)”);
}
}
}
}
public void look() // 查看
{
PersonInfo perInfo = null; // 接收数据对象
try
{
if (this.getFile().load() != null)
{
perInfo = (PersonInfo)this.getFile().load();
System.out.println(“当前信息为:”);
System.out.println(perInfo);
System.out.println(“数据输出成功!”);
}
else
{
System.out.println(“当前数据为空!”);
System.out.println(“您已将数据清空或者未曾保存数据!”);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class MenuAdd extends MenuOperate // 添加菜单
{
public void operate() // 覆写抽象方法
{
super.add();
}
}
class MenuDelete extends MenuOperate // 删除菜单
{
public void operate() // 覆写抽象方法
{
super.delete();
}
}
class MenuAlter extends MenuOperate // 修改菜单
{
public void operate() // 覆写抽象方法
{
super.alter();
}
}
class MenuLook extends MenuOperate // 查看菜单
{
public void operate() // 覆写抽象方法
{
super.look();
}
}
class MenuExit extends MenuOperate // 退出菜单
{
public void operate() // 覆写抽象方法
{
System.out.println(“…系统退出成功!”);
System.exit(0);
}
}
// 定义Factory类
package com.project.operate;
import com.project.inputdata.*;
//———————————————————————————————————————————工厂类——————————————————————————————————————
public class Factory
{
private MenuOperate[] menu = null; // 声明菜单数组
private int menuNum = 0; // 菜单个数
public Factory()
{
this.menuNum = 5;
this.menu = makeMenu(this.menuNum); // 开辟5个空间
this.initMenu();
this.selectMenu();
}
private MenuOperate[] makeMenu(int menuNum)
{
return new MenuOperate[menuNum]; // 生成菜单模型
}
private void initMenu() // 实例化菜单
{
this.menu[0] = new MenuAdd();
this.menu[0].setTitle(“[1]**增加数据**”);
this.menu[1] = new MenuDelete();
this.menu[1].setTitle(“[2]**删除数据**”);
this.menu[2] = new MenuAlter();
this.menu[2].setTitle(“[3]**修改数据**”);
this.menu[3] = new MenuLook();
this.menu[3].setTitle(“[4]**查看数据**”);
this.menu[4] = new MenuExit();
this.menu[4].setTitle(“[5]**系统退出**”);
}
private void selectMenu()
{
InputData input = new InputData(); // 获取标准输入
int select = 0;
do
{
System.out.println(“******数据管理系统**********”);
for (MenuOperate m : this.menu)
{
System.out.println(m.getTitle());// 打印菜单信息
}
select = input.getInt(“请选择:”, “请输入正确的选项”) – 1; // 用户输入
if (select >= 0 && select < this.menuNum)
{
this.menu[select].operate(); // 执行选择的菜单操作
}
else
{
System.out.println(“请输入合法的选项数字!”);
}
}
while (true);
}
}
//5.定义主方法类:生成系统
package com.project;
/*
@version 2010-03-30
@author XJY
在磁盘文件上保存一个人的信息数据,可以对该信息增、删、改、查;
这是一个内部逻辑的模拟实现,重点是模拟实现对象序列化以及java IO、类的设计等技术;
当然可以应用JDBC技术实现更真实的操作;
这是一个可扩展的系统框架,可以作为大型信息系统的子模块也可以作为单独的信息管理系统;
其中对泛型的使用,会带来编译时出现几个警告,向下转型、泛型可能出现的不安全操作,但本系统的设计没有这种风险;
*/
import com.project.operate.*; // 主操作逻辑实现
public class Main
{
public static void main(String[] args)
{
// 初始化系统:个人信息管理系统;
new Factory();
}
}
/* 测试平台:ubuntu linux 9.10-Desktop, java-version:jdk1.6.15;
administrator@xu-desktop:~$ java com.project.Main
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
1
请输入姓名:
张三
请输入年龄:
23
请输入地址:
山东济南历下区山大南路24号
请输入邮编:
250014
数据增加成功!
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
4
当前信息为:
姓名:张三 年龄:23; 地址:山东济南历下区山大南路24号 区号:250014
数据输出成功!
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
3
请选择您要修改的属性:
[1].姓名、[2].年龄、[3].地址、[4].邮编
1
请输入新的姓名:
张雪
您是否还要修改其他数据:(y/n?)
y
请选择您要修改的属性:
[1].姓名、[2].年龄、[3].地址、[4].邮编
2
请输入新的年龄:
24
您是否还要修改其他数据:(y/n?)
n
数据修改成功!
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
4
当前信息为:
姓名:张雪 年龄:24; 地址:山东济南历下区山大南路24号 区号:250014
数据输出成功!
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
2
数据删除成功!
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
4
当前信息为:
您已将数据清空或者未输入数据!
数据输出成功!
******数据管理系统**********
[1]**增加数据**
[2]**删除数据**
[3]**修改数据**
[4]**查看数据**
[5]**系统退出**
请选择:
5
退出菜单调用成功!系统退出成功!
*/
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java实现对象序列化的应用》
本文地址:http://www.xiupu.net/archives-107.html
关注公众号:
微信赞赏
支付宝赞赏