Java实现对象序列化的应用

实现对象序列化的具体应用是什么?

1.可以将对象信息保存到任何字节输出流中,当然不一定在文件中;
2.可以从任何字节输入流中读取可能提供的序列化对象;
3.实现Serializable接口,使用transient关键字;
4.使用对象数组处理;
——–个人信息管理系统: 约800行代码!
//1.实现系统操作对象:Person>
// 定义Info接口
package com.project.person;
// 接口实现序列化,当序列化接口以后版本增加内容时,不必逐一更改实现该接口的类,接口和抽象类一样可以不必实现抽象方法;
public interface Info extends .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        implements .io.Serializable// 泛型上限为接口Info ,T只能是Info子类
{
        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 = new Person(new Whois()); // 一个空的实例 T–>Whois
                perWhois.setInfo(new Whois(name, age)); // 给实例赋值
                System.out.println(perWhois.getInfo());
                String address = “北京”, zipCode = “10000”;
                Person perContact = new Person(new Contact()); // T–>Contact
                perContact.setInfo(new Contact(address, zipCode));
                System.out.println(perContact.getInfo());
        }       
}
/*
administrator@xu-desktop:~$ com.project.person.Person
姓名:张三 年龄:30
地址:北京 区号:10000
*/
// 定义PersonInfo类:
package com.project.person;
public class PersonInfo implements .io.Serializable        // 序列化对象
{
        private Person baseInfo = null;                // 基本信息
        private Person contact = null;        // 联系方式
        public PersonInfo()
        {
                this.baseInfo = new Person(new Whois());                // 实例化基本信息对象
                this.contact = new Person(new Contact());        // 实例化联系方式对象
        }
        // 以下方法满足不同的访问要求
        public Person getBaseInfo()
        {
                return this.baseInfo;        // 获取基本信息
        }
        public Person getContact()
        {
                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 .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;        // 用户输入

                                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实现对象序列化的应用
本文地址:https://www.zhiletu.com/archives-107.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微