使用谓词列表时出现 DataContract SerializationException

Posted

技术标签:

【中文标题】使用谓词列表时出现 DataContract SerializationException【英文标题】:DataContract SerializationException when using list of predicates 【发布时间】:2012-07-21 16:49:27 【问题描述】:

我正在编写一个通用过滤器类,主要用于从人群中过滤人员。我正在尝试序列化过滤器类,但在运行时我得到一个 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,那么它可以工作。但显然我也想序列化该属性。

我已经在这玩了几个小时了,但我想不通。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢。我可以为委托使用什么序列化程序? @tobier 坦率地说,大多数序列化程序不想这样做,因为委托是实现,而不是数据 .大多数序列化程序都对 data 感兴趣。我所知道的唯一一个真正适合于此的是BinaryFormatter。请不要将其误认为是推荐。你可以试试NetDataContractSerializer,它与BinaryFormatter 非常相似(本质上)。再次,不是推荐。我的建议是:序列化 data. 关于如何存储这个类有什么建议吗?我希望能够将这些由代表组成的过滤器存储在“filters.xml”中,以便将来可以使用它们。过滤器由应用程序中的用户创建。 @tobier 字符串表达式就足够了吗?即“x.Foo == 12 && x.IsOpen” @tobier 一些;我没有任何特别的建议,但这是一个很常见的问题【参考方案2】:

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

直到我在 MSDN 论坛上找到 this post 才知道我做错了什么。答案是:

我发现当我将 DataContract 和 DataMember 添加到我的班级时,一切正常。

捂脸

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

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

【讨论】:

我认为你这些天做的最多的是撞肘。谁能想到八年前我们会因为大流行和疯狂时期而在家工作。 @tobier - 我们在这里做“空中击掌”大声笑 - 站在 6 英尺以上的地方模仿击掌击掌。

以上是关于使用谓词列表时出现 DataContract SerializationException的主要内容,如果未能解决你的问题,请参考以下文章

Java SE 8 TemporalAccessor.from 与 java.time.Instant 对象一起使用时出现问题

序列化对象时出现循环引用错误。一对多关联对象

打开 oracle 表单时出现问题,您必须安装 J2SE 插件版本

访问核心数据中的子对象时出现关系错误

NSFetchedResultsController:当对象从较高索引移动到较低索引时出现异常

7645 Null 或空全文谓词