1

我正在Java中實現B Plus樹。我有一個節點類,我在其中維護對子對象節點的引用。現在,當我序列化任何節點時,它也會序列化所有子節點。我想要的只是序列化該節點和對子節點的引用。我嘗試將節點對象作爲字節流寫入,但解序列化它不起作用。如何序列化包含對象引用的java對象而不序列化引用的對象?

public class BNode implements Serializable 
{ 
    LinkedList<Float> keys; 
    LinkedList<BNode> childPointers; 
    BNode parent; 
... 
} 

在B +樹中,節點保存在磁盤中,我必須模擬該動作。現在每個頁面都是2 KB(說),所以在我的每個節點中,我將大約2044字節(255個浮點值和256個節點引用 - 總計255 * 4 + 255 * 4 +其他一些10字節的數據)的數據保存在單個文件模擬單個節點。現在,如果我序列化父節點,它會將整個樹序列化爲單個文件,從而破壞整個目的。

+0

你是指「對子節點的引用」是什麼意思? – SMA 2015-02-09 10:22:10

+0

添加樣例代碼 – justpraveen 2015-02-09 10:24:39

+0

你的意思是你只需要序列化父? – SMA 2015-02-09 10:27:43

回答

0

您必須使用transient。這排除了序列化的變量。

public class BNode implements Serializable 
{ 
    LinkedList<Float> keys; 
    LinkedList<BNode> childPointers; 
    transient BNode parent; 
... 
} 

如果您需要更復雜的規則,你可以去覆蓋缺省行爲(反)序列化實現此mehtods:

private void writeObject(ObjectOutputStream out) throws IOException; 
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; 

檢查http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html一個深入的說明。

+1

那麼childPointer列表。序列化對象還會序列化childPointer列表中的所有節點。 – justpraveen 2015-02-09 10:32:44

0

在任何實際的基於磁盤的B樹中,每個索引塊將需要包含與該塊中的鍵相對應的塊的盤偏移量。因此,您需要將參考數組設置爲瞬態,併爲偏移添加一個非瞬態數組long

我也建議你不要保留家長參考或抵消,如果你可以避免它。如果你記住每個搜索路徑,你可以避免它。在分裂內部節點的大型樹中,您不希望更新N/2個子節點中的父鏈接以及所有其他必須執行的操作。這是一個非常重要的性能影響。