2014-06-23 70 views
1

我需要將任意數量的文件(包含任何文件類型)作爲屬性存儲在類中。這個類將被序列化爲一個JSON文件。稍後,用戶可以將JSON文件重新加載到應用程序中,並且可以重新創建它們最初加載的文件。現在我將這些文件存儲爲一個字節數組。問題是某些文件很大,並且字節數組太大,導致序列化/反序列化需要很長時間。是否有可能將任何任意文件轉換爲字符串? (C#)

有沒有辦法將文件存儲爲字符串/字符串數組而不是字節?或者一些不同的存儲文件的方式?有什麼辦法可以解決這個問題?

編輯: 我相信一個字符串會更快,因爲現在當字節數組正在呈現出JSON以ASCII格式,所以它看起來是這樣的: 150,123,43,62 ...

+2

爲什麼你認爲一個字符串會比字節數組小?或者說,這個字符串會有什麼? –

+1

根據使用的編碼,字符串至少是字節數組的兩倍。 – xxbbcc

+0

大型文件需要很長時間才能加載,在軟件中修復該問題的能力並不大。 –

回答

1

使用Convert.ToBase64String()將您的字節數組編碼爲基本64字符串。這應該減少你的JSON的大小顯著:http://rextester.com/ILJNV57711

例如,這裏有一個隨機的字節數組,序列化爲JSON:

[95,103,154,174,23,5,178,179,158,186,181,89,40,229,233,168,217,42,98,65,248] 

這是同樣的陣列,轉換成基64串,系列化的JSON :

"X2earhcFsrOeurVZKOXpqNkqYkH4" 

很明顯,看到JSON中的字節數組較小時,表示爲基本64字符串。它從76個字符變爲30.

+0

我試過了: var horribleWay = File.ReadAllBytes(filePath); var goodWay = Convert.ToBase64String(horribleWay); 我在一個小文件上測試了這個,當我查看每個計數時,我發現horribleWay = 10152,goodWay = 13536.發生什麼事了? – user3715648

+0

@ user3715648你的文件是10kb,但是你寫給json的數據是一個有10,000個數字的數組。 base64應該寫成一個字符串。 – tophyr

+0

啊,是的。傻我。最後一件事:我如何將這個字符串寫回文件?我是否需要將其轉換回字節數組? – user3715648

1

當然,不要將字節數組存儲爲十進制數字, Base64至少對它進行編碼。 Base64編碼會將數據放大到原始文件大小的133%,但這對於您目前使用的400%放大而言將是一個巨大的改進。

+0

所以像這樣?: var horribleWay = File.ReadAllBytes(filePath); var goodWay = Convert.ToBase64String(horribleWay); – user3715648

+0

@ user3715648 yep – tophyr

+0

當我嘗試這個時,horribleWay的大小比goodWay小。爲什麼會發生? – user3715648

相關問題