2009-12-08 59 views
2

BinaryFormatter在我的代碼中表現怪異的方式。我有如下代碼binaryformatter如何序列化對象?

[Serializable] 
public class LogEntry 
{   
    private int id; 

    private List<object> data = new List<object>(); 

    public int Id 
    { 
     get { return id; } 
    } 

    public IList<object> Data 
    { 
     get { return data.AsReadOnly(); } 
    } 
    ... 
} 
.... 
.... 
private static readonly BinaryFormatter logSerializer = new BinaryFormatter(); 
.... 
.... 
public void SerializeLog(IList<LogEntry> logEntries) 
{ 
     using (MemoryStream serializationStream = new MemoryStream()) 
     { 
      logSerializer.Serialize(serializationStream, logEntries); 
      this.binarySerializedLog = serializationStream.GetBuffer(); 
     } 
} 

在某些機器(32位或64位機器)中,它是以二進制格式序列化 - 這是預期的。但在某些機器(他們都是64位的機器,而不是建立調試),它不序列化,binarySerializedLog正顯示出所有單個Data,類名(...LogEntry)和id價值ToString()價值。我的問題是 - 這種行爲有特定的原因還是我犯了一些錯誤?提前致謝。

回答

0

你的問題不是很清楚(你可以定義「無法序列化」?),但一些想法:

你真的應該使用ToArray()捕獲緩衝,不GetBuffer()(這便宜,但返回超大的數組,並且只能與Length一起使用)。

你在哪裏看到這個.ToString()BinaryFormatter寫入的對象的類型,然後或者使用反射來寫入字段([Serializable])或使用客戶序列化(對於ISerializable)。它從來沒有呼籲.ToString()(除非這是你的ISerializable)。然而,字符串等在「按原樣」輸出。

請注意,BinaryFormatter在版本之間可能會變得很脆弱,因此要小心如果您將此數據保留任意長度的時間(儘管假設您同時更新兩端,但對於傳輸通常很好)。如果您事先知道您的.Data對象是什麼,那麼有一系列基於合同的序列化器可能會提供更高的穩定性。如果您認爲這值得調查,我可以提供更具體的幫助。

+0

序列化成二進制格式後,它應該看起來像 - AAEAAAD ///// AQAAAAAAAAAMAgAAAHlNaWNyb3NvZnQ .... AAAAAAA == - 而不是那個,它顯示的東西像 - ExecutionResponse'1 [Response2] LogEntry2 - 其中ExecutionResponse'1 [RESPONSE2]是在。數據(在此特定情況下數據是包含類型ExecutionResponse的單個項目,其具有RESPONSE2對象(在此列出單個RESPONSE2對象)的列表中,LogEntry是當前的類名NAD 2是ID。 – malay 2009-12-08 06:48:55

+0

井,後者則是廣泛的,我期望什麼 - 這看起來* *是原始數據,然後將字段之前那張類型的元數據...我不認爲這是錯誤的(但) – 2009-12-08 07:36:36

+0

但在第二。如果不是所有的數據都出現在序列化日誌中,對嗎?我的意思是不可能從第二個日誌(即在ExecutionResponse'1 [Response2] LogEntry2)中反序列化。即使Response2是可序列化的,onse2仍然存在。 – malay 2009-12-08 09:15:21

相關問題