2010-04-21 62 views
0

考慮這一段代碼:序列化隊列的類型不工作

private Queue Date=new Queue(); 
//other declarations 
public DateTime _Date { 
get { return (DateTime)Date.Peek();} 
set { Date.Enqueue(value); } 
} 
//other properties and stuff.... 
public void UpdatePosition(...) 
{ 
    //other code 

    IFormatter formatter = new BinaryFormatter(); 
    Stream Datestream = new MemoryStream(); 
    formatter.Serialize(Datestream, Date); 
    byte[] Datebin = new byte[2048]; 
    Datestream.Read(Datebin,0,2048); 
    //Debug-Bug 
    Console.WriteLine(Convert.ToString(this._Date)); 
    Console.WriteLine(BitConverter.ToString(Datebin, 0, 3)); 

    //other code 
} 

第一的WriteLine的輸出是完美的。即,檢查隊列是否被初始化。它是。正確的變量存儲等(我插入該隊列中的值,該部分代碼未顯示)。

但第二個WriteLine沒有給出正確的預期答案:它將整個隊列序列化爲00- 00-00。

回答

2

如果您使用

formatter.Serialize(Datestream, Date)

序列化的數據,你應該使用類似

Date = (Queue)formatter.Deserialize(Datestream)

到反序列化。您當前的代碼正在使用兩種不同且不兼容的方式以二進制格式表示數據。

至於爲什麼您存儲DateTime例如在一個名爲DateQueue和名稱的屬性_Date,那是另一個問題...

+0

謝謝彼得,是的,我想我會和這一起去。我以這種方式成功實現了這一點: 'Pos.Date = DeSerFormatter.Deserialize(DateDeserial),作爲隊列;' 我可以理解IL對於兩者都必須是相同的。 其次,我將'Queue'類型改爲'隊列' – Soham 2010-04-22 06:37:32

1

你需要從中讀取之前倒帶MemoryStream到開始:

memoryStream.Position = 0; 

或者,如果你只是想將內容作爲字節數組,使用ToArray代替Read

byte[] buffer = memoryStream.ToArray(); 
+0

你的意思是說,我需要填充Datebin陣列之前插入此行(用Read()?) – Soham 2010-04-21 03:27:25

+0

是的。您需要首先將「Datestream」的聲明更改爲「MemoryStream」,以便訪問該屬性。 – dtb 2010-04-21 03:31:52

+0

DTB,你的意思是說DateStream.Position和DateStream.ToArray()? – Soham 2010-04-21 03:32:32