2012-10-12 41 views
2

我有類似的問題,以Serializing a HashSet在Dictionary

序列化一個HashSet我有類型的成員。一類Dictionary<String,HashSet<T>>

當我序列與BinaryFormatter的對象,然後反序列化,它出現空。

我不知道如何,或者在哪裏打電話發佈變通here

任何提示?提前致謝。

編輯: 我試圖將哈希集轉換爲列表,作爲其他線程建議的註釋之一。

對象看起來像這樣:

public class THashSet : HashSet<T> , ISerializable 
{ 

    public THashSet(SerializationInfo info, StreamingContext context) 
    { 
     var list = (List<T>)info.GetValue("hashset", typeof(List<T>));  
     foreach (T t in list) 
      this.Add(t); 
    } 

    public override void GetObjectData(SerializationInfo info,StreamingContext context) 
    { 
     info.AddValue("hashset", this.ToList<T>()); 
    } 

當含有THashSet對象被反序列化(和構造函數被調用),列表被正確地恢復,因爲我在調試器看到。

但串行完成後,該對象僅包含一個空的HashSet。

+2

使用其他一些序列化程序,如[Json.Net](http://json.codeplex.com/)。它適用於你的情況。 –

+0

可悲的是我不能使用另一個序列化器,因爲這是一個相當大的項目中的一個小細節。其他一切都很好串行我 –

回答

1

假設爲你的T對象,你還沒有覆蓋的GetHashCode方法和equals。你需要這樣做。

UPD:全部取決於您的對象實現。對象並不像你說的那麼容易。你sitation,對象:

[Serializable] 
public class DataClass 
{  
    public DataClass() 
    { 
    } 

    public DataClass(string name, string description) 
    { 
     Name = name; 
     Description = description; 

     this.Dictionary = new Dictionary<string, HashSet<DataClass>>(); 
    } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public Dictionary<string, HashSet<DataClass>> Dictionary { get; set; } 
} 

,系列化/解串代碼:

DataClass dataClass = new DataClass("name", "descr"); 
dataClass.Dictionary.Add("key1", new HashSet<DataClass>() { new DataClass("sample11", "descr11"), new DataClass("sample12", "descr12") }); 
dataClass.Dictionary.Add("key2", new HashSet<DataClass>() { new DataClass("sample21", "descr21"), new DataClass("sample22", "descr22") }); 
dataClass.Dictionary.Add("key3", new HashSet<DataClass>() { new DataClass("sample31", "descr31"), new DataClass("sample32", "descr32") }); 

byte[] serialized; 
var formatter = new BinaryFormatter(); 

using (MemoryStream stream = new MemoryStream()) 
{ 
    formatter.Serialize(stream, dataClass); 
    serialized = stream.ToArray(); 
} 
using (MemoryStream streamDeserial = new MemoryStream()) 
{ 
    streamDeserial.Write(serialized, 0, serialized.Length); 
    streamDeserial.Seek(0, SeekOrigin.Begin); 
    var dictDeserial = formatter.Deserialize(streamDeserial) as DataClass; 
} 

此代碼工作得很好。

+0

實現這些功能,但沒有結果 –

+0

@ Dr.Wummi能否請您發表您的T類型的對象或類似物體具有這些功能的實現。有了這些對象,我也可以試着重現你的問題。 – Regfor

+0

該對象只包含公共字符串成員以及一些只將某些字符串設置爲默認值的構造函數。 此對象在使用其他方法(ArrayLists,Lists和Dictionaries)時序列化很好 –