2011-09-27 57 views
3

我有下面的代碼中,我試圖序列化列表保存到文件數據契約序列化的IList <T>

public static void Serialize<T>(this IList<T> list, string fileName) 
{ 
    try 
    { 
     var ds = new DataContractSerializer(typeof(T)); 
     using (Stream s = File.Create(fileName)) 
      ds.WriteObject(s, list); 
    } 
    catch (Exception e) 
    { 
     _logger.Error(e); 
     throw; 
    } 
} 

,我得到異常:

類型「 System.Collections.Generic.List`1 [[MyClass的myNameSpace對象,版本= 1.0.0.0,文化=中性 公鑰=空]]」與數據合同名 'ArrayOf * MyClass *:http://schemas.datacontract.org/2004/07/ MyNameSpace' 不是預期的。考慮使用DataContractResolver或通過使用KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型的 列表,將靜態未知的任何 類型添加到已知類型列表中 - 例如, 。

[KnownType(typeof(MyClass))] 
[DataContract] 
public class MyClass 
{ 
    #region Properties 
    [DataMember] 
    public string Foo{ set; get; } 
    [DataMember] 
    public string Bar{ set; get; } 
} 

任何想法?

沒有繼承。

+6

你不應該做新的DataContractSerializer (typeof(列表))或類似的 –

+0

良好的捕獲。你可以寫作答覆,所以我可以標記它。謝謝, – DarthVader

+0

沒問題,之前做過同樣的事情:) –

回答

3

發生了什麼事是串行期待T,不是一件T列表的一個實例,所以你希望你的方法是像這樣:

public static void Serialize<T>(this IList<T> list, string fileName) 
{ 
    try 
    { 
     var ds = new DataContractSerializer(list.GetType()); 
     using (Stream s = File.Create(fileName)) 
     ds.WriteObject(s, list); 
    } 
    catch (Exception e) 
    { 
    _logger.Error(e); 
    throw; 
    } 
} 
0

如上所述,串行器應該用於列表,而不是項目的類型。

另外,[KnownType(typeof(MyClass))]應該從參數MyClass中繼承一個類,而不是MyClass本身。

0

嘗試這個代替:

變種DS =新的DataContractSerializer(typeof運算(T []));