2010-04-30 18 views
7

Sto serializzando un dizionario generico in VB.net e sono molto sorpreso che si tratti di 1.3kb con un singolo elemento. Sto facendo qualcosa di sbagliato, o c'è qualcos'altro che dovrei fare? Ho un gran numero di dizionari e mi sta uccidendo per mandarli tutti attraverso il filo. Il codice che uso per la serializzazione èPerché è un dizionario generico .net così grande

Dim dictionary As New Dictionary(Of Integer, Integer) 
    Dim stream As New MemoryStream 
    Dim bformatter As New BinaryFormatter() 

    dictionary.Add(1, 1) 

    bformatter.Serialize(stream, dictionary) 

    Dim len As Long = stream.Length 

risposta

7

La serializzazione predefinita per un dizionario deve includere informazioni sul tipo per il tipo del dizionario, il comparatore utilizzato e per i tipi di ciascuno degli elementi (sia chiave che valore) in quanto potrebbero essere in genere sottotipi. Questo overhead deve essere aggiunto per ogni dizionario. Se si stampano i dati come una stringa si può vedere che ci sono un sacco di tipi qualificati prendendo un sacco di byte:

\ 0 \ 0 \ 0 \ 0 ???? \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0? System.Collections.Generic.Dictionary 2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\0\0\0\aVersion\bComparer\bHashSize\rKeyValuePairs\0\0\b?System.Collections.Generic.GenericEqualityComparer 1 [[System.Int32, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] b ? System.Collections.Generic.KeyValuePair 2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]\0\0\0\t\0\0\0\0\0\0\t\0\0\0\0\0\0?System.Collections.Generic.GenericEqualityComparer 1 [[System.Int32, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] \ 0 \ 0 \ 0 \ 0 \ a \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0? System.Collections.Generic.KeyValuePair 2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]?????System.Collections.Generic.KeyValuePair 2 [[System.Int32, mscorlib, Version = 2.0.0.0, Culture = neutro, PublicKeyToken = b77a5c561934e089], [System.Int32 , mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] \ 0 \ 0 \ 0valore di chiavi \ 0 \ 0 \ b \ b \ 0 \ 0 \ 0 \ 0 \ v

Si potrebbe preferire utilizzare un formato personalizzato per la serializzazione, oppure un formato standard leggermente più leggero come JSON.

4

Ci sono un sacco di spese generali coinvolti nella creazione del dizionario per la serializzazione (ovviamente, più o meno 1.3kb;)). Tuttavia, scoprirai che le dimensioni non aumentano drasticamente man mano che vengono aggiunti più elementi alla tua raccolta, purché tu stia utilizzando tipi primitivi per chiavi e valori.

Questo sovraccarico è principalmente una volta, costo iniziale - quindi una volta che si ottiene la classe Dizionario serializzata, i membri contenuti non aggiungono tanta dimensione.