我有以下代码,我正在尝试将列表序列化为文件
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; }
}
有什么想法吗?
没有遗产。
答案 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 []));