2012-04-10 49 views
1

我想寫入一個文件的序列化爲JSON格式的對象數組。我試圖用兩種不同的方式寫下來,如下所示。兩個相同的文件具有不同的文件大小基於從C#編寫的方式

ToSerialise[] Obj = new ToSerialise[10]; 
     for (int i = 0; i < 10; i++) 
     { 
      Obj[i] = new ToSerialise(); 
     } 

     //First form of serialising 
     UnicodeEncoding uniEncoding = new UnicodeEncoding(); 
     String SerialisedOutput; 
     SerialisedOutput = JsonConvert.SerializeObject(Obj, Formatting.Indented); 
     FileStream fs1 = new FileStream(@"C:\file1.log", FileMode.CreateNew); 
     fs1.Write(uniEncoding.GetBytes(SerialisedOutput), 0, uniEncoding.GetByteCount(SerialisedOutput)); 
     fs1.Close(); 

     //Second form of serialising 
     FileStream fs2 = new FileStream(@"C:\file2.log", FileMode.CreateNew); 
     StreamWriter sw = new StreamWriter(fs2); 
     JsonWriter jw = new JsonTextWriter(sw); 
     JsonSerializer js = new JsonSerializer(); 
     jw.Formatting = Formatting.Indented; 
     js.Serialize(jw, Obj); 
     jw.Close(); 
     fs2.Close(); 

儘管兩個文件的內容相同,但它們具有不同的文件大小。實際上第一個文件的大小正好是第二個文件的兩倍。我試着比較使用textpad的輸出,它說它們是激動人心的相同。爲什麼他們有不同的文件大小?

我在Windows 7 32位運行此,.NET4

感謝

+0

你有沒有試過打開在WinHex或類似的東西中產生的兩個文件?這可以讓你在原始十六進制中識別它們之間的差異,並可以幫助你找出導致它們被保存爲不同文件大小的原因。 – GeorgePotter 2012-04-10 14:17:28

+0

「兩個相同的文件具有不同的文件大小」。這僅僅是一個矛盾。 – EJP 2012-04-11 00:38:58

+0

@EJP對,這是真的,但一些文件比較實用程序顯示文件相同。我現在有同樣的問題。問題是如何(在我的情況下,第二個文件大小約爲200%!)。 – Andrew 2017-11-03 12:09:01

回答

9

即使兩個文件的內容是相同的,它們有不同的文件大小。

如果他們有不同的大小,那麼他們肯定有不同的內容。一個文件(幾乎)只是一個字節序列 - 如果兩個序列具有不同的長度,則它們是不同的序列。

在這種情況下,這兩個文件都代表相同文本,但使用不同的編碼 - file2將使用UTF-8,和file1將使用UTF-16。

想一想它的另一種方式:如果您將相同的圖片保存爲兩個文件,一個爲JPEG,一個爲PNG,您希望文件的大小相同嗎?

+0

感謝您的快速回答!現在我看到文件屬性,它分別表示ANSI和Unicode。 – Manoj 2012-04-10 13:20:55

+0

@Manoj:「ANSI」僅僅是一個猜測(在這種情況下它甚至不是一個精確的術語)。它真的*使用UTF-8 - 但是如果你的文本只包含ASCII,那麼你可以用任何ASCII兼容的編碼讀取它,並且你會得到相同的結果。 – 2012-04-10 13:23:06

+0

我現在有點困惑。 UTF-8意味着它使用8位來表示每個字符?我認爲ASCII有256個字符,所以他們匹配。 UTF-16將允許65536字符變體,因此可以表示更多腳本。這是正確的嗎?但現在我看到維基百科我看到Unicode可以用UTF 8和UTF 16表示。那是怎麼回事? – Manoj 2012-04-10 13:32:43

相關問題