我正在编写一个通用过滤器类,主要用于从人群中过滤人员。我正在尝试序列化筛选器类,但在运行时,我得到一个SerializationException:
System.Runtime.Serialization.SerializationException : Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
我的过滤器类如下:
[DataContract(Name = "Filter", Namespace = "")]
public class Filter<T>
{
/// <summary>
/// Default constructor, needed by serializers.
/// </summary>
public Filter()
{
Name = "New filter";
Predicates = new List<Predicate<T>>();
}
/// <summary>
/// ctor. Takes a list of predicates for type T
/// to filter with.
/// </summary>
public Filter(string name, IEnumerable<Predicate<T>> predicates)
{
Name = name;
Predicates = predicates.ToList();
}
/// <summary>
/// Name of the filter.
/// </summary>
[DataMember(Order = 0)]
public string Name
{
get;
set;
}
[DataMember(Order = 1)]
public List<Predicate<T>> Predicates
{
get;
set;
}
/// <summary>
/// Filters sequence of type T.
/// </summary>
public IEnumerable<T> ApplyFilter(IEnumerable<T> input)
{
var result = new List<T>(input);
return Predicates.Aggregate(result, (current, predicate) => current.FindAll(predicate));
}
}
在序列化filter类时,我会得到上面的异常。如果我不将谓词标记为DataMember,那么它就起作用了。但很明显,我也想序列化该属性。
我已经做了几个小时了,我想不通。任何帮助都将不胜感激!
DataContractSerializer
不用于序列化委托;多播委托是一组任意的目标对象和方法;这不是一个定义良好的面向数据的契约。DataContractSerializer
适用于数据。
将某种形式的表达式序列化为字符串(或某种简单的树),或者使用不同的序列化程序。
我没有试图复活一个死帖子,但我搜索了(基本上)相同的错误消息,这个问题目前是第一个结果,但我没有试图对委托做任何事情!
直到我在MSDN论坛上找到这篇文章,我才明白自己做错了什么。答案是:
我发现,当我将DataContract和DataMember添加到类中时,一切都正常。
facepalm
我试图序列化一个自定义类,但没有用[DataContract]
属性标记该类,由于我不理解的原因,这导致XML序列化程序抛出了关于委托的错误。
发布这个答案以帮助所有未来的访问者社交距离冠状病毒时代还有五分之遥