2011-04-28 24 views
3

我在運行時對象的集合,這已經是序列化的,我需要將對象的狀態持續到文件中。我使用BinaryFormatter進行了快速編碼,並將序列化的對象保存到文件中。C#二進制序列化一行到文件中的行或如何單獨

我在想我可以保存每行對象。但是當我在記事本中打開文件時,它比一行更長。它不滾動。我怎樣才能每行存儲一個二進制序列化的對象?

我知道我可以使用分隔每個對象後因此而讀他們返回給應用程序,我可以知道對象的末尾。那麼,根據信息理論,這會增加數據的大小(Sipser書)。

什麼是最好的算法,拿出那woudldnt打破信息的分離?

而不是二進制序列化?你認爲JSon格式更可行嗎?我可以將實體以逐行格式存儲爲json格式嗎?

而且,序列化/反序列化開銷介紹,打性能。 Json會更快嗎?

想法?

謝謝。

謝謝。

回答

6

像一個FIFO隊列序列化功能,你沒有,因爲格式化會爲你讀取文件的部分,你只需要知道你裏面推對象的順序。

public class Test 
    { 

     public void testSerialize() 
     { 
      TestObj obj = new TestObj(); 
      obj.str = "Some String"; 
      IFormatter formatter = new BinaryFormatter(); 
      Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
      formatter.Serialize(stream, obj); 
      formatter.Serialize(stream, 1); 
      formatter.Serialize(stream, DateTime.Now); 
      stream.Close(); 
     } 

     public void TestDeserialize() 
     { 
      Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.None); 
      IFormatter formatter = new BinaryFormatter(); 
      TestObj obj = (TestObj)formatter.Deserialize(stream); 
      int obj2 = (int)formatter.Deserialize(stream); 
      DateTime dt = (DateTime)formatter.Deserialize(stream); 
      stream.Close(); 
     } 
    } 

    [Serializable] 
    class TestObj 
    { 
     public string str = "1"; 
     int i = 2; 
    } 
+0

我不知道這個工作 - 非常整齊,+1。 – Justin 2011-04-28 00:53:19

+0

有趣。我應該嘗試一下。 – DarthVader 2011-04-28 00:53:36

+0

好的問題:你怎麼知道文件中有多少個對象?你計劃如何填充所有這些? – DarthVader 2011-04-28 00:54:55

1

好,

序列化/反序列化產生開銷,將Json的更快?

JSON仍是序列化的一種形式,沒有它可能不會比二進制序列化速度更快 - 二進制序列化的目的是緊湊和快速,wheras JSON序列穿上可讀性更強調和這麼多的速度較慢因爲很可能不那麼緊湊。

你可以逐個序列化每個對象,並在每個對象之間發射一些分隔符(例如換行符),但我不知道你可以使用哪個分隔符保證不會出現在序列化數據中(如果你將包含換行符的字符串序列化?)。

如果使用了.NET序列化框架,然後發出很明顯,你將很難(如果不是不可能的話)正確地確定在對象之間的斷裂是導致deserialisation失敗的分隔符。

爲什麼你想把每個對象放在自己的線上?

+0

這樣我就可以逐行讀取對象的行,我woudlnt需要一個分隔符。 – DarthVader 2011-04-28 00:48:04

+0

@ user177883爲什麼不直接序列化一個對象數組呢? – Justin 2011-04-28 00:49:01

+0

可能工作。好主意。我應該將所有對象存儲在列表中,然後將列表序列化到文件中? – DarthVader 2011-04-28 00:52:34

1

二進制串行化將數據保存到任意字節;這些字節可以包含換行符。

您要求使用換行符作爲分隔符。換行符與其他分隔符沒有區別;他們也會增加數據的大小。

0

您還可以創建一個ArrayList和對象添加到它,然後將其序列化)

ArrayList list = new ArrayList(); 
list.Add(1); 
list.Add("Hello World"); 
list.Add(DateTime.Now); 

BinaryFormatter bf = new BinaryFormatter(); 

FileStream fsout = new FileStream("file.dat", FileMode.Create); 
bf.Serialize(fsout, list); 
fsout.Close(); 

FileStream fsin = new FileStream("file.dat", FileMode.Open); 
ArrayList list2 = (ArrayList)bf.Deserialize(fsin); 

fsin.Close(); 

foreach (object o in list2) 
    Console.WriteLine(o.GetType()); 
相關問題