2012-05-16 37 views
1

我想使用protobuf-net v2序列化/反序列化包含hashtable屬性的自定義類。使用協議緩衝區(.NET)序列化哈希表

[ProtoContract] 
    public class MyClass 
    { 
     [ProtoMember(1)] 
     public Hashtable MyHashTable { get; set; } 
    } 

當我打電話Serializer.Serialize(...)出現異常: 沒有類型定義的串行:System.Collections.Hashtable

我試着修改:

[ProtoContract] 
    public class MyClass 
    { 
     [ProtoMember(1, DynamicType = true)] 
     public Hashtable MyHashTable { get; set; } 
    } 

但我有另一個例外: 類型不是預期的,並且不能推斷出合同:System.Collections.DictionaryEntry

也許有人知道我如何序列化散列表?

+0

是否要序列化存儲在散列表或散列表本身中的對象? –

+0

在反序列化之後存儲散列表並使用它將會很好,但是如果有一種方法只存儲散列表中的對象 - 這是正確的。 –

+2

protobuf-net目前不直接支持這種情況,我不確定這是我急於支持的一種情況。在基於合約的序列化程序中,*意圖*是提前知道數據的形狀。例如,一個'Dictionary '可以工作* fine *,因爲它非常清楚這意味着什麼以及數據將包含什麼。 –

回答

1

感謝所有幫助我的人。這是我的解決方案。我知道這不是最好的方式,但也許對某個人來說是可以接受的。

[ProtoContract] 
    public class HashtableTestClass 
    { 
     private string inputParametersBase64 = string.Empty; 
     private Hashtable myHashTable; 

     public Hashtable MyHashtable 
     { 
      get { return myHashTable; } 
      set { myHashTable = value; } 
     } 

     [ProtoMember(1)] 
     public string InputParametersBase64 
     { 
      get 
      { 
       if (myHashTable == null) 
        return string.Empty; 

       return HashtableToBase64(myHashTable); 
      } 
      set 
      { 
       inputParametersBase64 = value; 
       if (!string.IsNullOrEmpty(inputParametersBase64)) 
       { 
        try 
        { 
         myHashTable = Base64ToHashtable(inputParametersBase64); 
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(e); 
        } 
       } 
      } 
     } 

     public static Hashtable Base64ToHashtable(string s) 
     { 
      MemoryStream stream = new MemoryStream(Convert.FromBase64String(s), false); 
      IFormatter formatter = new BinaryFormatter(); 

      return (Hashtable)formatter.Deserialize(stream); 
     } 

     public static string HashtableToBase64(Hashtable hashtable) 
     { 
      IFormatter formatter = new BinaryFormatter(); 
      MemoryStream stream = new MemoryStream(); 
      formatter.Serialize(stream, hashtable); 
      stream.Close(); 
      return Convert.ToBase64String(stream.ToArray()); 
     } 
    }