参考两篇博客:

http://blog.csdn.net/moreevan/article/details/6697777

http://blog.csdn.net/moreevan/article/details/6698529

针对第二篇博客,看了下面的评论,发现子类输出的书号其实是父类的,书名是自己先添加的成员变量,我自己在实验的时候,发现子类NewBook中使用父类Book的变量部分,输出的都没有值:基本类型的系统默认值是0,非基础类型例如字符串系统默认是null

然后,当把父类Book实现了序列化接口时,这是才能全部输出子类的变量值:

并且第二篇博客里也写到了,如果在打印对象的时候,会调用对象的toString方法,即使我在子类中覆盖了toString()方法并且没有调用父类的toString方法,但是系统依然报出了第二篇博客中提到的那个错误:java.io.InvalidClassException: NewBook; no valid constructor

所以父类中加了个空的无参构造函数,这样就可以正常打印出来了,下面是全码:

1、父类没有实现序列化接口:(此时不可以打印子类的变量值)

import java.io.Serializable;

public class Book {
int book_num;
String book_authour;
//构造函数
public Book(int abook_num, String abook_author)
{
this.book_num = abook_num;
this.book_authour = abook_author; }
public Book()
{ }
//设置作者名
public void setBookAuthor(String abook_author)
{
this.book_authour = abook_author;
}
//设置书号
public void setBookNum(int abook_num)
{
this.book_num = abook_num;
}
//打印对象
public String toString(){
return "book_num:"+book_num+"\n"+"book_anthor:"+book_authour;
}
}

2、父类实现序列化接口:(此时可以打印子类的变量值)

import java.io.Serializable;

public class Book implements Serializable {
int book_num;
String book_authour;
/**
* 实现序列化接口的时候一定要分配序列ID
*/
private static final long serialVersionUID = 1L;
//构造函数
public Book(int abook_num, String abook_author)
{
this.book_num = abook_num;
this.book_authour = abook_author; }
public Book(){ }
//设置作者名
public void setBookAuthor(String abook_author)
{
this.book_authour = abook_author;
}
//设置书号
public void setBookNum(int abook_num)
{
this.book_num = abook_num;
}
//打印对象
public String toString(){
return "book_num:"+book_num+"\n"+"book_anthor:"+book_authour;
}
}

3、子类:

import java.io.Serializable;

public class NewBook extends Book implements Serializable{
private String book_version;
/**
* 实现序列化接口的时候一定要分配序列ID
*/
private static final long serialVersionUID = 1L; public NewBook(int abook_num, String abook_author,String abook_version)
{
super(abook_num, abook_author);
this.book_version = abook_version;
// TODO Auto-generated constructor stub
}
@Override
public void setBookAuthor(String abook_author)
{
// TODO Auto-generated method stub
super.setBookAuthor(abook_author);
}
@Override
public void setBookNum(int abook_num)
{
// TODO Auto-generated method stub
super.setBookNum(abook_num);
}
public void setBookVersion(String abook_version)
{
book_version = abook_version;
}
@Override
public String toString()
{
// TODO Auto-generated method stub
return "new_book_num:"+book_num+"new_book_anthor:"+book_authour+"new_book_version"+book_version;
}
}

4、主函数:

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream; public class BookSerializable { public static void main(String args[])
{
/*
* Java里的main方法里不能直接调用非静态的对象,要么调用静态变量,要么调用在方法内部实例化的非静态局部变量
*/
NewBook new_book1 =new NewBook(1,"呼啸山庄","1.0");
NewBook new_book2 =new NewBook(2,"红与黑","2.0");
/*
* 将对象序列化到文件中
*/
try {
File fil = new File("C://JavaFile//red_bean.txt");
if(!fil.exists())
{
fil.createNewFile();
}
FileOutputStream fil_input = new FileOutputStream(fil);
ObjectOutputStream obj_output= new ObjectOutputStream(fil_input);
obj_output.writeObject(new_book1);
obj_output.reset();
new_book1.setBookVersion("3.0");
obj_output.writeObject(new_book1);
obj_output.reset();
new_book1.setBookVersion("4.0");
obj_output.writeObject(new_book1);
obj_output.writeObject(new_book2);
obj_output.writeObject(null);//写入结束标志方便读取(非常重要,如果不写入,在读取的时候无法定位读取结束);
obj_output.close();//关闭对象输出流
fil_input.close();//关闭文件输出流
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} /*
* 将对象从文件中读出来
*/
ObjectInputStream obj_input; try {
FileInputStream fil_input = new FileInputStream("C://JavaFile//red_bean.txt");
obj_input = new ObjectInputStream(fil_input);
Object boj;
while((boj = obj_input.readObject())!=null)//循环读取对象流
{
NewBook new_bookReadTemp = (NewBook)boj;
System.out.println(new_bookReadTemp);
/*
* 读出的时候按照写入的顺序读取
*/
/*NewBook new_bookRead1 = (NewBook)obj_input.readObject();
NewBook new_bookRead2 = (NewBook)obj_input.readObject();
NewBook new_bookRead3 = (NewBook)obj_input.readObject();
NewBook new_bookRead4 = (NewBook)obj_input.readObject();
//NewBook new_bookRead5 = (NewBook)obj_input.readObject();
System.out.println(new_bookRead1);
System.out.println(new_bookRead2);
System.out.println(new_bookRead3);
System.out.println(new_bookRead4);
//System.out.println(new_bookRead5);
*/ }
obj_input.close();
fil_input.close();
}
catch(EOFException e){
e.printStackTrace();
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

自己动手敲了一遍代码的感受:

确实应该多多动手呀!编惯了Android,感觉养成了很不好的语法习惯,main()是个静态方法,我还在main方法外面定义了了非静态对象,在main方法里用,显然不行啊,调用非静态方法,然后在非静态方法里使用非静态变量,或者直接在main方法里定义非静态局部变量并使用,Java里没有全局变量的概念,要共享数据就专门定义一个share类, 里面全是静态的变量方法。不要把安卓的onCreat和main混在一起。main里的变量定义和使用:http://blog.csdn.net/zi_jun/article/details/7553132

其他的Java序列化较好博客:

http://blog.csdn.net/wangzhiqing3/article/details/8392803

Java文件操作:

http://www.cnblogs.com/springcsc/archive/2009/12/03/1616367.html

http://blog.csdn.net/smartcat86/article/details/4085739/

Java序列化与反序列化,文件操作的更多相关文章

  1. Java基础(五)-Java序列化与反序列化

    .output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...

  2. Java序列化和反序列化,你该知道得更多

    序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新 ...

  3. Java 序列化和反序列化(二)Serializable 源码分析 - 1

    目录 Java 序列化和反序列化(二)Serializable 源码分析 - 1 1. Java 序列化接口 2. ObjectOutputStream 源码分析 2.1 ObjectOutputSt ...

  4. Java 学习笔记(14)—— 文件操作

    java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...

  5. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  6. [转] Java序列化与反序列化

    原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...

  7. Java序列化与反序列化(Serializable)

    Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...

  8. Java序列化与反序列化(实践)

    Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...

  9. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  10. Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨.  1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节 ...

随机推荐

  1. w3chtml页面和css书写规范

    http://www.cnblogs.com/Wenwang/archive/2011/09/07/2169881.html

  2. Java 堆内存(Heap)[转]

    将jvm内存很不错的文章,转自 堆(Heap)又被称为:优先队列(Priority Queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复 ...

  3. 初学HTML5的一点理解

    刚接触了一点点用h5移动端的一点知识,用自己最浅薄的理解来看解决自适应屏幕尺寸问题和适应屏幕尺寸的布局问题.这里,为了解决自适应屏幕尺寸问题大概需要做的就是把HTML中的元素的尺寸尽可能的用百分比表示 ...

  4. tabBar自定义

    有时系统的tabBar并不能满足我们的开发需求: 这时,我们需要自定义一个tabBar.直接上代码: // 在tabBarController中用KVC更换掉系统tabBar [self setVal ...

  5. apache2.2.25+mod_jk-apache-2.2.2.so+apache-tomcat-7.0.56集群

    1.安装httpd-2.2.25-win32-x86-no_ssl.msi 按默认安装路径,我电脑如果自定义的话安装不了 2.下载mod_jk-apache-2.2.2.so 3.下载tomcat 我 ...

  6. hrbustoj 2283 heap解题报告

    这是我们校赛的一道题,给一个字符串,判断这是字符串描绘的是不是一个堆,并不难,只是一个简单的模拟,但是也稍微有点麻烦,最起码我的方法代码量比较大,主要用栈做一个父亲与儿子的位置匹配,匹配的方法应该有很 ...

  7. USACO Section 1.2 Milking Cows 解题报告

    题目 题目描述 有3个农夫每天早上五点钟便起床去挤牛奶,现在第一个农夫挤牛奶的时刻为300(五点钟之后的第300个分钟开始),1000的时候结束.第二个农夫从700开始,1200结束.最后一个农夫从1 ...

  8. 在java中使用dom4j包对String格式的xm数据l解析

    在网上找了好久,都没搞出来,借鉴别人的代码,依葫芦画瓢,写了个自己用的解析类.注意节点属性和子节点的区别就好了,这个包的方法还挺好用的 package com.allinpay.utils; impo ...

  9. UI常用控件

    UICommonlyUsedControls [UI常用控件] 不需要学习多么深入,但是要知道系统提供的有用的控件. 一.UISwitch(开关) 二.UIActivityIndicatorView( ...

  10. JAVA基础--正则表达式

    .  any character \d  A digit 0-9 \D  a non-digit [^0-9] \s  a whitespace character, 空白字符 \S  a non-w ...