C# 使用谓词列表时发生DataContract序列化异常
我正在编写一个通用的过滤器类,它主要用于过滤人群中的人。我正在尝试序列化筛选器类,但在运行时出现SerializationException:C# 使用谓词列表时发生DataContract序列化异常,c#,serialization,datacontractserializer,C#,Serialization,Datacontractserializer,我正在编写一个通用的过滤器类,它主要用于过滤人群中的人。我正在尝试序列化筛选器类,但在运行时出现SerializationException: System.Runtime.Serialization.SerializationException : Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 'DelegateSerializationHolder.DelegateEntry:h
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;我没有什么特别的建议,但这是一个很常见的问题,我想你这些天做什么最多也只是说说而已。疯狂的蒂姆,八年前,谁会想到我们会因为大流行而在家工作