java文件序列化_Java序列化与反序列化,文件操作
參考兩篇博客:
http://blog.csdn.net/moreevan/article/details/6697777
http://blog.csdn.net/moreevan/article/details/6698529
針對(duì)第二篇博客,看了下面的評(píng)論,發(fā)現(xiàn)子類輸出的書號(hào)其實(shí)是父類的,書名是自己先添加的成員變量,我自己在實(shí)驗(yàn)的時(shí)候,發(fā)現(xiàn)子類NewBook中使用父類Book的變量部分,輸出的都沒有值:基本類型的系統(tǒng)默認(rèn)值是0,非基礎(chǔ)類型例如字符串系統(tǒng)默認(rèn)是null
然后,當(dāng)把父類Book實(shí)現(xiàn)了序列化接口時(shí),這是才能全部輸出子類的變量值:
并且第二篇博客里也寫到了,如果在打印對(duì)象的時(shí)候,會(huì)調(diào)用對(duì)象的toString方法,即使我在子類中覆蓋了toString()方法并且沒有調(diào)用父類的toString方法,但是系統(tǒng)依然報(bào)出了第二篇博客中提到的那個(gè)錯(cuò)誤:java.io.InvalidClassException: NewBook; no valid constructor
所以父類中加了個(gè)空的無參構(gòu)造函數(shù),這樣就可以正常打印出來了,下面是全碼:
1、父類沒有實(shí)現(xiàn)序列化接口:(此時(shí)不可以打印子類的變量值)
importjava.io.Serializable;public classBook {intbook_num;
String book_authour;//構(gòu)造函數(shù)
public Book(intabook_num, String abook_author)
{this.book_num =abook_num;this.book_authour =abook_author;
}publicBook()
{
}//設(shè)置作者名
public voidsetBookAuthor(String abook_author)
{this.book_authour =abook_author;
}//設(shè)置書號(hào)
public void setBookNum(intabook_num)
{this.book_num =abook_num;
}//打印對(duì)象
publicString toString(){return "book_num:"+book_num+"\n"+"book_anthor:"+book_authour;
}
}
2、父類實(shí)現(xiàn)序列化接口:(此時(shí)可以打印子類的變量值)
importjava.io.Serializable;public class Book implementsSerializable {intbook_num;
String book_authour;/*** 實(shí)現(xiàn)序列化接口的時(shí)候一定要分配序列ID*/
private static final long serialVersionUID = 1L;//構(gòu)造函數(shù)
public Book(intabook_num, String abook_author)
{this.book_num =abook_num;this.book_authour =abook_author;
}publicBook(){
}//設(shè)置作者名
public voidsetBookAuthor(String abook_author)
{this.book_authour =abook_author;
}//設(shè)置書號(hào)
public void setBookNum(intabook_num)
{this.book_num =abook_num;
}//打印對(duì)象
publicString toString(){return "book_num:"+book_num+"\n"+"book_anthor:"+book_authour;
}
}
3、子類:
importjava.io.Serializable;public class NewBook extends Book implementsSerializable{privateString book_version;/*** 實(shí)現(xiàn)序列化接口的時(shí)候一定要分配序列ID*/
private static final long serialVersionUID = 1L;public NewBook(intabook_num, String abook_author,String abook_version)
{super(abook_num, abook_author);this.book_version =abook_version;//TODO Auto-generated constructor stub
}
@Overridepublic voidsetBookAuthor(String abook_author)
{//TODO Auto-generated method stub
super.setBookAuthor(abook_author);
}
@Overridepublic void setBookNum(intabook_num)
{//TODO Auto-generated method stub
super.setBookNum(abook_num);
}public voidsetBookVersion(String abook_version)
{
book_version=abook_version;
}
@OverridepublicString toString()
{//TODO Auto-generated method stub
return "new_book_num:"+book_num+"new_book_anthor:"+book_authour+"new_book_version"+book_version;
}
}
4、主函數(shù):
importjava.io.EOFException;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutput;importjava.io.ObjectOutputStream;public classBookSerializable {public static voidmain(String args[])
{/** Java里的main方法里不能直接調(diào)用非靜態(tài)的對(duì)象,要么調(diào)用靜態(tài)變量,要么調(diào)用在方法內(nèi)部實(shí)例化的非靜態(tài)局部變量*/NewBook new_book1=new NewBook(1,"呼嘯山莊","1.0");
NewBook new_book2=new NewBook(2,"紅與黑","2.0");/** 將對(duì)象序列化到文件中*/
try{
File fil= new File("C://JavaFile//red_bean.txt");if(!fil.exists())
{
fil.createNewFile();
}
FileOutputStream fil_input= newFileOutputStream(fil);
ObjectOutputStream obj_output= newObjectOutputStream(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);//寫入結(jié)束標(biāo)志方便讀取(非常重要,如果不寫入,在讀取的時(shí)候無法定位讀取結(jié)束);
obj_output.close();//關(guān)閉對(duì)象輸出流
fil_input.close();//關(guān)閉文件輸出流
} catch(FileNotFoundException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}/** 將對(duì)象從文件中讀出來*/ObjectInputStream obj_input;try{
FileInputStream fil_input= new FileInputStream("C://JavaFile//red_bean.txt");
obj_input= newObjectInputStream(fil_input);
Object boj;while((boj = obj_input.readObject())!=null)//循環(huán)讀取對(duì)象流
{
NewBook new_bookReadTemp=(NewBook)boj;
System.out.println(new_bookReadTemp);/** 讀出的時(shí)候按照寫入的順序讀取*/
/*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();
}
}
}
自己動(dòng)手敲了一遍代碼的感受:
確實(shí)應(yīng)該多多動(dòng)手呀!編慣了Android,感覺養(yǎng)成了很不好的語法習(xí)慣,main()是個(gè)靜態(tài)方法,我還在main方法外面定義了了非靜態(tài)對(duì)象,在main方法里用,顯然不行啊,調(diào)用非靜態(tài)方法,然后在非靜態(tài)方法里使用非靜態(tài)變量,或者直接在main方法里定義非靜態(tài)局部變量并使用,Java里沒有全局變量的概念,要共享數(shù)據(jù)就專門定義一個(gè)share類, 里面全是靜態(tài)的變量方法。不要把安卓的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/
總結(jié)
以上是生活随笔為你收集整理的java文件序列化_Java序列化与反序列化,文件操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle定义变量sql赋值_ORAC
- 下一篇: 【Java从入门到头秃专栏 6】语法篇(