4 Stimmen

Kann meine `ObservableDictionary<TKey, TValue>` Klasse nicht serialisieren

Ich habe meine public sealed class ObservableDictionary : NotifyPropertyChangedClass, INotifyCollectionChanged, IDictionary where TKey: IEquatable Klasse geschrieben.

Es ist als [Serializable] markiert.

Aber ich habe eine Ausnahme bekommen, als ich versucht habe, eine Instanz von ObservableDictionary zu serialisieren.

Ausnahmemeldung:

Der Typ MS.Internal.Data.EnumerableCollectionView in der Assembly "PresentationFramework, Version=4.0.0.0, Culture=neutral," ist nicht als serialisierbar markiert mit PublicKeyToken=31bf3856ad364e35.

Aber ich habe den Typ MS.Internal.Data.EnumerableCollectionView nie verwendet.

Wo liegt mein Fehler? Mein Code befindet sich unten:

using System;
using System.ComponentModel;

namespace RememberEmployees {

    [Serializable]
    public abstract class NotifyPropertyChangedClass : INotifyPropertyChanged {        
        protected void NotifyPropertyChanged(string propertyName) {
            PropertyChangedEventHandler temp = PropertyChanged;
            if (temp != null) {
                temp(this, new PropertyChangedEventArgs(propertyName));
            }
        }        
        public event PropertyChangedEventHandler PropertyChanged;
    }
}

und

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections.Specialized;

namespace RememberEmployees {   
    [Serializable]
    public sealed class ObservableDictionary : NotifyPropertyChangedClass, 
        INotifyCollectionChanged, IDictionary where TKey: IEquatable {
        SortedDictionary dict;

        IComparer Comparer {
            get { return dict.Comparer; }
        }

        public ObservableDictionary() {
            dict = new SortedDictionary();
            IsReadOnly = false;
        }

        private void NotifyCollectionChanged(NotifyCollectionChangedAction action) {
            NotifyCollectionChangedEventHandler temp = CollectionChanged;
            if (temp != null) {
                temp(this, new NotifyCollectionChangedEventArgs(action));
            }
        }

        // Weitere Methoden hier ...

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
            return dict.GetEnumerator();
        }
    }
}

2voto

Alois Kraus Punkte 12713

Dies hat weniger mit Ihrer Klasse zu tun, sondern mehr mit den Daten, die Sie in Ihrer Sammlung gespeichert haben. Es scheint, dass Sie in Ihrer Sammlung ein ViewObject gespeichert haben, das intern ein EnumerableCollectionView-Objekt enthält.

Beim Serialisieren von Daten müssen Sie sicher sein, welche Teile Ihres Objektgraphen Sie serialisieren möchten. Einfach Objekte in Ihre Sammlung zu legen könnte dazu führen, dass die Hälfte Ihrer Anwendungsdaten über das Netzwerk oder auf die Festplatte gesendet wird. Es gibt einen guten Grund, warum der DataContractSerializer erfunden wurde.

Sie sollten vor dem Serialisierungsaufuruf wissen, welche Daten Sie serialisieren möchten. Andernfalls kann es passieren, dass Sie z.B. in einer Client-Server-Anwendung versuchen, Typen zu deserialisieren, die sich in Assemblys befinden, die nur auf dem Server existieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X