2013-12-22 28 views
0

我在C#中手工編制了一個序列化程序。如何在散列表上使用二進制?

我需要通過BinaryWriter編寫散列表。問題是哈希表中的條目的值可以是int32,int64,string,double中的任何一個...... 我可以將任何內容轉換爲字符串,並使用BinaryWrite寫入文件。但是當我做BinaryRead時,我怎麼知道這個值的類型?

一個想法是將值的類型寫入文件。但是這對於一個大的散列表來說會是一個很大的開銷。

注:我不想使用binaryformatter,因爲我手工製作。

編輯:由於某種原因關閉了問題。顯然,我需要對這個問題有所瞭解。希望現在已經清楚了。

+0

所以你有一個單一的散列表與混合類型(int32,int64等)的條目?鍵是混合類型還是隻是值?你需要它來快速序列化還是存儲效率更重要?所有的值條目是否都是值類型,或者是否還有引用類型/對象? – nicholas

+0

鍵的類型並不重要。如果有值的解決方案,也可以應用於鍵。我更喜歡快速序列化。對象或值類型無關緊要。我爲相關對象編寫了一個序列化方法。 –

回答

0

當類型可以更改時,您需要對類型和值進行編碼。您可以使用一些快捷方式來縮小結果文件,但會使算法複雜化。

與AMF防止重複字符串有點相似的一種方法是保留一個已知類型名稱的正在運行的數組。如果類型與其中一個類型名稱匹配,則將數組索引寫入下一個位置。如果該類型是尚未遇到的新類型,請將新索引以及完整類型名稱寫爲字符串。

例如,假設哈希表:

var t = new Hashtable { 
       { 'a', 1 }, 
       { 'b', "Two" }, 
       { 'c', 3 }; 

正如你可能會這樣寫出來:

[char] a 
[int] 0  // new integer into type array 
[string] System.Int32 
[int] 1 
[char] b 
[int] 1  // new integer into type array 
[string] System.String 
[string] Two 
[char] c 
[int] 0  // reference first element of type array, which we know is System.Int32 

聽起來很複雜,但實現並不難,但可以得到很容易出錯,如果你擺烏龍一路走來(對於沒有明確分隔符的自定義二進制文件,情況總是如此)。

當然,對於Hashtable,您確實需要對鍵和值執行相同的操作,但這會讓您朝着正確的方向尋求一種可能的解決方案。

+0

這不是一個完整的解決方案(我沒有想到),但給我的方向繼續前進。非常感謝你。 –