序列化與反序列化——源碼解析與常用方法

引言

不知道是否有很多讀者跟我一樣,對序列化和反序列化這一對名詞始終是一知半解,處於一種會用但不懂的奇怪狀態。本文就詳細地從java源碼的層面來解釋一下序列化與反序列化究竟是什麼,有什麼作用,以及是怎麼實現的。

1.序列化的作用

大傢都知道,java是強制性的面向對象語言,萬物皆對象。但是在實際使用中,我們始終還是要把這些對象轉化為適合我們存儲、閱讀、編輯的數據。

比如:網頁開發中需要讀取出入參,在源碼中往往就是對象;程序輸出/讀取某些數據…….

這些都是非常實際的應用場景,但是java不可能直接傳輸一個對象類過去,那麼我們就需要將這些對象,或者java的數據,轉化為“字節序列”這個非常常用且方便的形式。這就是序列化的核心:把java對象轉為字節序列。

反序列化定義則與之相反,一定程度上這也是java適用范圍如此廣的原因之一,畢竟序列化提供的字節序列可以很方便的在其他平臺上流轉。

2.序列化的基本方法

還是用我最喜歡的user來舉例

@Data
//將實體類交給spring管理,自動掃描
@Component
//加載配置內容,設定配置前綴,註意:prefix參數不支持小駝峰原則,必須全部小寫@ConfigurationProperties(prefix = "user")
public class User implements Serializable{
@Value("132456")
private Integer uid;
@Value("wy")
private String uname;
@Value("asd")
private String password;
@Value("Beijing, Sichuan, Nanchang")
private List<String> addrs;
public User() {
}
public User(Integer uid, String uname, String password, ArrayList<String> addrs) {
this.uid = uid;
this.uname = uname;
this.password = password;
this.addrs = addrs;
}
public static void serialize( User user ) throws IOException {
ObjectOutputStream objectOutputStream =
new ObjectOutputStream(Files.newOutputStream(new File("user.txt").toPath()));
objectOutputStream.writeObject( user );
objectOutputStream.close();
System.out.println("序列化成功!已經生成user.txt文件");
System.out.println("==============================================");
}
public static void deserialize() throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream =
new ObjectInputStream(Files.newInputStream(new File("user.txt").toPath()));
User user = (User) objectInputStream.readObject();
objectInputStream.close();
System.out.println("反序列化結果為:");
System.out.println( user );
}}

赞(0)