C# 使用谓词列表时发生DataContract序列化异常

C# 使用谓词列表时发生DataContract序列化异常,c#,serialization,datacontractserializer,C#,Serialization,Datacontractserializer,我正在编写一个通用的过滤器类,它主要用于过滤人群中的人。我正在尝试序列化筛选器类,但在运行时出现SerializationException: System.Runtime.Serialization.SerializationException : Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 'DelegateSerializationHolder.DelegateEntry:h

我正在编写一个通用的过滤器类,它主要用于过滤人群中的人。我正在尝试序列化筛选器类,但在运行时出现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));
        }
    }
[DataContract(Name=“Filter”,Namespace=”“)]
公共类过滤器
{
/// 
///序列化程序所需的默认构造函数。
/// 
公共过滤器()
{
Name=“新建过滤器”;
谓词=新列表();
}
/// 
///接受类型T的谓词列表
///过滤。
/// 
公共筛选器(字符串名称、IEnumerable谓词)
{
名称=名称;
谓词=谓词。ToList();
}
/// 
///筛选器的名称。
/// 
[数据成员(订单=0)]
公共字符串名
{
得到;
设置
}
[数据成员(顺序=1)]
公共列表谓词
{
得到;
设置
}
/// 
///T型过滤器序列。
/// 
公共IEnumerable ApplyFilter(IEnumerable输入)
{
var结果=新列表(输入);
返回谓词.Aggregate(result,(current,predicate)=>current.FindAll(predicate));
}
}
序列化过滤器类时,我得到了上面的异常。如果我没有将谓词标记为DataMember,那么它就可以工作。但显然,我也想序列化该属性


我已经做了好几个小时了,我想不出来。任何帮助都将不胜感激

DataContractSerializer
不用于序列化委托;多播委托是一组任意的目标对象和方法;这不是一个定义良好的面向数据的契约
DataContractSerializer
用于数据


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

DataContractSerializer
不用于序列化委托;多播委托是一组任意的目标对象和方法;这不是一个定义良好的面向数据的契约
DataContractSerializer
用于数据


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

我没有尝试恢复死信,但我(基本上)搜索了相同的错误消息,这个问题目前是#1结果,但我不尝试对委托做任何事情

直到我在MSDN论坛上发现,我才知道我做错了什么。答案是:

我发现,当我将DataContract和DataMember添加到我的类中时,一切都起了作用

掌纹

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


发布此答案以帮助所有未来的访问者。从冠状病毒时代算起,社会距离遥远的high five

我没有试图恢复一个死帖子,但我搜索了(基本上)相同的错误消息,这个问题目前是#1结果,但我没有试图对代理做任何事情

直到我在MSDN论坛上发现,我才知道我做错了什么。答案是:

我发现,当我将DataContract和DataMember添加到我的类中时,一切都起了作用

掌纹

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


发布此答案以帮助所有未来的访问者。从冠状病毒时代算起,社会距离遥远的high five

谢谢。我可以为委托使用什么序列化程序?@tobier坦率地说,大多数序列化程序都不想这样做,因为委托是实现,而不是数据。大多数序列化程序都对数据感兴趣。我所知道的唯一一个真正适合这种情况的是
BinaryFormatter
。请不要误以为这是一个建议。您可以尝试
NetDataContractSerializer
,它与
BinaryFormatter
非常相似(本质上)。同样,这不是一个建议。我的建议是:序列化数据。有关于如何存储此类的建议吗?我希望能够将这些由代理组成的筛选器存储在(比如)一个“filters.xml”中,以便将来可以使用它们。过滤器是由应用程序中的用户创建的。@tobier字符串表达式就足够了吗?i、 e.“x.Foo==12&&x.IsOpen”@tobier some;我没有什么特别的建议,但这是一个很常见的问题,谢谢。我可以为委托使用什么序列化程序?@tobier坦率地说,大多数序列化程序都不想这样做,因为委托是实现,而不是数据。大多数序列化程序都对数据感兴趣。我所知道的唯一一个真正适合这种情况的是
BinaryFormatter
。请不要误以为这是一个建议。您可以尝试
NetDataContractSerializer
,它与
BinaryFormatter
非常相似(本质上)。同样,这不是一个建议。我的建议是:序列化数据。有关于如何存储此类的建议吗?我希望能够将这些由代理组成的筛选器存储在(比如)一个“filters.xml”中,以便将来可以使用它们。过滤器是由应用程序中的用户创建的。@tobier字符串表达式就足够了吗?i、 e.“x.Foo==12&&x.IsOpen”@tobier some;我没有什么特别的建议,但这是一个很常见的问题,我想你这些天做什么最多也只是说说而已。疯狂的蒂姆,八年前,谁会想到我们会因为大流行而在家工作