當類型可以更改時,您需要對類型和值進行編碼。您可以使用一些快捷方式來縮小結果文件,但會使算法複雜化。
與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,您確實需要對鍵和值執行相同的操作,但這會讓您朝着正確的方向尋求一種可能的解決方案。
所以你有一個單一的散列表與混合類型(int32,int64等)的條目?鍵是混合類型還是隻是值?你需要它來快速序列化還是存儲效率更重要?所有的值條目是否都是值類型,或者是否還有引用類型/對象? – nicholas
鍵的類型並不重要。如果有值的解決方案,也可以應用於鍵。我更喜歡快速序列化。對象或值類型無關緊要。我爲相關對象編寫了一個序列化方法。 –