IO对象流(序列化和反序列化)
序列化和反序列化概念:
序列化:
把堆內存中的java對象數據,通過某種方式把對象存儲到磁盤文件中或者傳遞給其他網絡的節點(在網絡上傳輸)
反序列化:
把磁盤文件中的對象數據或者網絡節點上的對象數據,恢復成java對象的過程。
為什么要做序列化:
1):在分布式系統中,需要共享的數據的JavaBean對象,都得做序列化,此時需要把對象再網絡上傳輸,此時就得把對象數據轉換為二進制形式.
以后存儲在HttpSession中的對象,都應該實現序列化接口(只有實現序列化接口的類,才能做序列化操作).
2):服務鈍化:如果服務發現某些對象好久都沒有活動了,此時服務器就會把這些內存中的對象,持久化在本地磁盤文件中(Java對象–>二進制文件).
如果某些對象需要活動的時候,現在內存中去尋找,找到就使用,找不到再去磁盤文件中,反序列化我們得對象數據,恢復成Java對象.
需要做序列化的對象的類,必須實現序列化接口:
java.io.Serializable接口(標志接口[沒有抽象方法]).
底層會判斷,如果當前對象是Serializable的實例,才允許做序列化. boolean ret = Java對象 instanceof Serializable;
在Java中大多數類都已經實現Serializable接口.
使用對象流來完成序列化和反序列化操作:
ObjectOutputStream: 通過writeObject方法做序列化操作的.ObjectInputStream: 通過readObject方法做反序列化操作的.注意:
Exception in thread "main" java.io.NotSerializableException: com.test.User表示User類沒有實現序列化接口,java.io.Serializable序列化的細節序列化的版本:
1):如果某些數據不需要做序列化,比如密碼,此時怎么辦?
理論上說,靜態的字段和瞬態的字段是不能做序列化操作的.
如果不顯示定義serialVersionUID類變量,該類變量的值由JVM根據類相關信息計算,而修改后的類的計算方式和之前往往不同.
從而造成了對象反序列化因為版本不兼容而失敗的問題.
解決方案:在類中提供一個固定的serialVersionUID.
public static final long serialVersionUID=1L;練習代碼:
package com.test;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class User implements Serializable{public String Name;public int age;public String Sex;public User(String Name, int age, String Sex) {// TODO Auto-generated constructor stubthis.Name=Name;this.age=age;this.Sex=Sex;} } public class Main {public static void main(String[] args) throws Exception {File file = new File("file/obj.txt"); writeObject(file);readObject(file);} //反序列化操作 public static void readObject(File file) throws Exception, Exception {// TODO Auto-generated method stubObjectInputStream stream = new ObjectInputStream(new FileInputStream(file));User user =(User) stream.readObject();System.out.println(user.Name+"-"+user.age+"-"+user.Sex);stream.close();} //序列化操作public static void writeObject(File file) throws Exception, Exception {// TODO Auto-generated method stubObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(file));stream.writeObject(new User("DreamZuora",23,"男"));stream.close();} }總結
以上是生活随笔為你收集整理的IO对象流(序列化和反序列化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断对象属性值是否为空
- 下一篇: dubbo启动服务启动报错.Unsati