2

我正在编写一个通用过滤器类,主要用于从人群中过滤人。我正在尝试序列化过滤器类,但在运行时我得到一个 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));
        }
    }

序列化过滤器类时,出现上述异常。如果我不将谓词标记为 DataMember,那么它可以工作。但显然我也想序列化该属性。

我已经在这里待了几个小时了,我无法弄清楚。任何帮助将不胜感激!

4

2 回答 2

4

DataContractSerializer不用于序列化委托;多播委托是一组任意目标对象和方法;这不是一个定义明确的面向数据的合同。DataContractSerializer用于数据

将某种形式的表达式序列化为字符串(或一些简单的树),或使用不同的序列化程序。

于 2012-07-23T12:47:39.507 回答
0

不试图复活一个死帖,但我搜索(基本上)相同的错误消息,这个问题目前是#1结果,但我不想对代表做任何事情!

直到我在 MSDN 论坛上找到这篇文章之前,我无法弄清楚我做错了什么。答案是:

我发现当我在课堂上添加 DataContract 和 DataMember 时,一切正常。

掌心

我试图序列化一个自定义类,但没有用该[DataContract]属性标记该类,并且由于我不明白的原因,这导致 XML 序列化程序抛出有关委托的错误。

发布此答案以帮助所有未来的访问者。从冠状病毒时代开始远离社会的高五!

于 2020-06-04T20:51:52.883 回答