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 に答える