假設我有一個對象叫做data
,它包含各種信息。讓我們假設data
圖中實際上有相當多的東西。C#對象序列化的元信息
如果我使用BinaryFormatter
將其序列化,那麼我得到一個5Mb的文件。 如果我將序列化流封裝在GZipStream
中,那麼我會得到一個更小的文件,比如1Mb。
如果需要,我可以在壓縮流時加密流,或者在不壓縮流的情況下加密流。
問題是:我需要知道在序列化過程中做了什麼,以便在反序列化時知道該怎麼做。
一種技術是使用不同的文件擴展名。例如,未壓縮的未加密文件可能具有.dat擴展名,.zdat用於壓縮,.cdat用於加密,.czdat用於壓縮和加密。
這會工作,但它引入了一個潛在的問題:如果用戶更改擴展名等等。這也意味着如果我想在Windows中關聯文件,則有4個擴展名而不是1個,這需要相關聯 - 將與現有協會衝突的風險翻兩番。
如果我換我的數據對象在一個簡單的類:
[Serializable]
public class SerialisationContainer
{
public string SerialisedData { get; private set; }
public bool Compressed { get; private set; }
public bool Encrypted { get; private set; }
public SerialisationContainer()
{
// etc...
}
public object GetObject()
{
// etc...
}
}
然後我基本上連載其中有一個序列化流可以壓縮和/或加密的對象,但我們不」因爲元信息存儲在SerialisationContainer
中,所以此時不知道或小心。
您認爲如何?我基本上只是好奇你對這種方法的看法,以及你在類似情況下做了什麼。我認爲上述方法是一種非常浪費的做我想做的事情的方式。我基本上需要序列化我的數據圖到內存流,將其轉換爲字符串,將字符串放入我的容器中,然後再次將其串行化。
另一個問題是string SerialisedData
的長度。在我給出的例子中,我們只有大約5Gb的BinaryData,但是什麼時候它開始變大?我知道在64位操作系統上,string
的上限大約爲2GB,而32位操作系統的上限要小得多。流是否有這樣的限制?由於數據流是以字節爲單位寫入的,所以它們不會。
謝謝:)我沒有想過寫頭字節 - 但現在我明白了。他們說事後總是20/20。 – Ozzah 2011-03-30 23:58:08