2011-12-13 70 views
2

假設情景:實現SerializableMessage類型對象的輸出流。 Message有會員HeaderBodyHeader很小,Body可能很大。假設我想根據Header中的信息編寫過濾器:有沒有辦法做到這一點,而不必反序列化Body是否有反序列化Java中的對象的一部分的方法?

+1

分別序列化它們,存儲兩個對象,只讀第一個對象? – 2011-12-13 20:15:25

+0

假設分手'消息'是不可能的。 – user443854 2011-12-13 20:19:02

回答

1

你可以寫一個自定義的readObject()來只讀取你想要的字段。 如果您只想讀取標題,則需要注意先串行化標題然後再正文。然後在您的自定義readObject()方法中,您可以選擇只讀取第一個元素。

public class Message implements Serializable { 

    private transient String header; 
    private transient String body; 

    ... 
    // custom write object that writes header first and then body 
    private void writeObject(java.io.ObjectOutputStream oos) 
     throws IOException { 
    oos.defaultWriteObject(); 
    // explicitly store the transient fields 
    oos.writeObject(header); 
    oos.writeObject(body); 
    } 

    private void readObject(java.io.ObjectInputStream ois) 
     throws IOException, ClassNotFoundException { 
    ois.defaultReadObject(); 
    // explicitly read in the transient fields 
    header = (String) ois.readObject(); 
    if (needBody()) { // use some static/thread local variable to set this condition 
     body = (String) ois.readObject(); 
    } 
    } 
} 
3

通過聲明transient,您不能序列化身體。

但是,如果您已經序列化了Message對象,則無法有選擇地反序列化特定成員。

+0

在這個構造的例子中,消息主體是有原因的。它攜帶對消費者有用的信息,提供的頭部通過過濾器。 – user443854 2011-12-13 20:38:04

+0

@ user443854:在這種情況下,請參考我的第二點。你不能選擇性反序列化。 – bragboy 2011-12-13 20:38:51

2

與數據庫相比,您剛剛發現了面向對象編程的一個弱點:「如果我只想要一半Customer對象?」

我想說的是,你需要將你的Message類拆分成類似MessageHeader的東西,包含頭部信息並且沒有引用正文,還有一個MessageBody類,它有一個可以用來查看的主體和一個鍵上傳標題數據。然後,您需要分別存儲和檢索序列化的MessageHeader和MessageBody對象。

相關問題