我是靠谱客的博主 沉默钢铁侠,最近开发中收集的这篇文章主要介绍【JAVA】通过实现java.io.Serializable接口启用类的序列化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在java中,通过java.io.Serializable接口可以实现类的序列化,从而实现类的读写操作。在之前的java上机实验中用到了这个接口,后来做课程设计,又用到了这个功能,不得不说java的这个接口功能十分强大,但是对于十分小白的我。。。功能强大归功能强大,在敲代码的过程中还是遇到了许多错误,所以写在博客里分享一下。

刚接触java时做过这样一个题:

设计学生类Student,属性:学号(整型);姓名(字符串),选修课程(名称)及课程成绩(整型)。编写一个控制台程序,能够实现Student信息的保存、读取。具体要求:(1)提供Student信息的保存功能:通过控制台输入若干个学生的学号、姓名以及每个学生所修课程的课程名和成绩,将其信息保存到data.dat中;(2)数据读取显示:能够从data.dat文件中读取学生及其课程成绩并显示于控制台。

具体代码如下:


package T4;

import java.util.*;
import java.io.*;

public class Student 
	implements java.io.Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private int ID;
	private String lesson;
	private int score;
	public static int numofstu=0;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getID() {
		return ID;
	}
	public void setID(int iD) {
		ID = iD;
	}
	public String getLesson() {
		return lesson;
	}
	public void setLesson(String lesson) {
		this.lesson = lesson;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	
	public static void showTips(){
		System.out.println("请输入接下来的操作:");
		System.out.println("in:录入学生信息");
		System.out.println("out:输出学生信息");
		System.out.println("exit:退出系统");
	}
	public static void InputInfo(List<Student> stuList){
		
		Scanner in=new Scanner(System.in);
		while(true){
			Student tmp=new Student();
			System.out.println("请输入学生姓名,若停止录入请输入exit:");
			String name=in.next();
			if(name.equals("exit")){
				break;
			}
			tmp.setName(name);
			System.out.println("请输入学生学号:");
			int ID=in.nextInt();
			tmp.setID(ID);
			System.out.println("请输入学生选修课程名称:");
			String lesson=in.next();
			tmp.setLesson(lesson);
			System.out.println("请输入学生课程成绩:");
			int score=in.nextInt();
			tmp.setScore(score);
			stuList.add(tmp);
			numofstu++;
		}
		in.close();
	}
	public static void OutputInfo(List<Student> stuList){
		FileOutputStream fos = null;
		ObjectInputStream ois = null;
		ObjectOutputStream oos = null;
		try {
			fos = new FileOutputStream("src/T4/stulist.dat");
			oos = new ObjectOutputStream(fos);
			for(int i=0;i<numofstu;++i){
				oos.writeObject(stuList.get(i));
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}finally{
			try {
				fos.close();
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try{
			ois = new ObjectInputStream(
			new FileInputStream("src/T4/stulist.dat"));
			while(true){
				try{
					Student p = (Student)ois.readObject();
					System.out.println("姓名:" + p.getName()+"  学号:"+p.getID()+"  选修课程:"+p.getLesson()+"  成绩:"+p.getScore());
				}catch(EOFException e){
					break;
				}catch(ClassNotFoundException e){
					break;
				}
			}
		}catch (IOException e){
			e.printStackTrace();
		}finally{
			try {
				ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		
		Scanner in=new Scanner(System.in);
		List<Student> stuList=new ArrayList<Student>();
		while(true){
			showTips();
			String ope=in.nextLine();
		
			if(ope.equals("in")){
			InputInfo(stuList);
			}
			else if(ope.equals("out")){
				OutputInfo(stuList);
			}
			else if(ope.equals("exit")){
				break;
			}
		}
		in.close();
	}

}

在student类信息写入文件这个过程中用到了Serializable接口,实现了学生类各属性的序列化写入文件。而后来的数据库课程设计功能需求与student类信息写入文件相似,是要求设计table类用来表示数据库中的数据表,并且要有相应的存储文件实现断电保存数据库中表的信息。

具体代码如下:

	public void CreateTable() throws IOException {
		FileOutputStream fos = null;
		ObjectInputStream ois = null;
		ObjectOutputStream oos = null;
		// 将当前表信息写入以该表名命名的.dat文件中
		try {
			fos = new FileOutputStream("src/" + tname + ".dat");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			oos = new ObjectOutputStream(fos);
			oos.writeObject(this);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				fos.close();
				oos.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

		}
		try {
			ois = new ObjectInputStream(new FileInputStream("src/" + tname + ".dat"));
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		// 测试表信息是否写入文件保存成功
		while (true) {
			try {
				Table p = (Table) ois.readObject();
				//打印表的信息
				System.out.println("表名:" + p.tname);
				System.out.println("列名t类型t长度t列级约束t");
				for(int i=0;i<p.col_name.size();++i){
					System.out.print(p.col_name.get(i)+"t");
					
					System.out.print(p.type.get(i)+"t");
					
					if(p.len.get(i)==0) System.out.print("-t");
					else System.out.print(p.len.get(i) + "t");
					
					//输出列级约束
					System.out.print(p.c_constraints.get(i).Judge());
					System.out.println();
				}
				
				System.out.print("表级约束:");
				if(p.t_constraints.size()==0){
					System.out.println("无");
				}
				else{
					for(int i=0;i<p.t_constraints.size();++i){
						System.out.println(p.t_constraints);
					}
				}

			} catch (EOFException e) {
				break;
			} catch (ClassNotFoundException e) {
				break;
			}
			
		}
	}

但是!在运行时出现了编译错误,但经检查没有任何语法错误,在table类声明时也implements了接口java.io.Serializable。

出现编译错误的原因在于,我写的table类中包含一个ArrayList<Colconstraints>类型的属性,而Colconstraints又是一个类,但是这个类并没有实现序列化接口,这就导致了table类在实现类的写操作时出现了错误,导致编译出错。


更改后Colconstraints类代码如下:

public class Colconstraints implements java.io.Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public boolean primarykey;
	public boolean notnull;
	public boolean null_;
	public boolean unique;
	public boolean check;
}

解决了这一问题。

最后

以上就是沉默钢铁侠为你收集整理的【JAVA】通过实现java.io.Serializable接口启用类的序列化的全部内容,希望文章能够帮你解决【JAVA】通过实现java.io.Serializable接口启用类的序列化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部