IList <t> </t>的数据合同序列化

时间:2011-09-27 03:23:43

标签: c# serialization datacontractserializer datacontract

我有以下代码,我正在尝试将列表序列化为文件

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,文化=中立,   具有数据协定名称的PublicKeyToken = null]]'   '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; }
}

有什么想法吗?

没有遗产。

3 个答案:

答案 0 :(得分:4)

发生的事情是序列化程序期望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;
   } 
} 

答案 1 :(得分:0)

根据建议,序列化程序应该用于列表,而不是项目类型。

此外,[KnownType(typeof(MyClass))]应该从参数中继承MyClass的类,而不是MyClass本身。

答案 2 :(得分:0)

试试这个:

  

var ds = new DataContractSerializer(typeof(T []));