Witam, w mojej większej aplikacji, która zmierza ku końcowi próbuję zserialozować ObservableCollection. Jest jednak problem. Ta ObservableCollection jest DataContextem(i ItemSourcem) Listview, który znowu ma własny ItemTemplate - taki, którego nie da się zserializować. W trakcie serializacji otrzymuję błąd, mówiący o tym, że nie mogę zserializować pewnego obiektu, który należy do mojego ItemTemplate. Obiekt o którym mowa to EventManager. Tak czy inaczej, nie mogę sprawić, aby był Serializable. Co z tym fantem począć?
Najprawdopodobniej trzeba zrobic wlasna serrializcje wykorzystując wbudowane mechanizmy. Jakiś czas temu czytałem, że metody serializacji można dość elastycznie rozbudowaywać.
Ja akurat olałem automaty i zrobiłem własny mechanizm serializacji w swomi sofcie, ponieważ mam pewność, że nie napotkam na problemy, które w nieoczekiwany sposob spowodują, że będe musiał nagle tysiące linii kodu, bo standardowe mechanizmy na to może nie pozwolą albo trzeba bedzie mocno kombinować.
pzdr
squash
Dzięki bardzo za odpowiedź. Po zastanowieniu uznałem, że lepiej będzie się przerzucić na bazę danych. Serializacja w moim wypadku to nie najlepszy pomysł.
A rozwijając pytanie...
Dlaczego przypisanie kolekcji jako DataContext ma wpływ na tą właśnie kolekcję - w tym wypadku przy serializacji? O co tu chodzi?
Zaraz, może zaczniemy od tego co dokładnie chcesz zserializować? Bo ja nie do końca rozumiem który obiekt chcesz serializować.
Samo ObservableCollection<T> powinno dać się zserializować, pod warunkiem że typ T jest serializowalny.
No właśnie chodzi o to, że się nie da. Jeżeli kolekcja jest DataContextem nie działa, jeżeli nie jest - działa. Zaraz zrobię przykładowy program i wrzucę w załączniku.
Hmm... Więc zrobiłem przykładowy program i masz rację. Nie ma to wpływy na kolekcję. Jednak dlaczego w mojej aplikacji ma. Autentycznie ustawiam DataContext - nie da się, nie ustawiam DataContextu, lub później wrzucam go na null, i działa. Co ja mogę robić źle? Bardziej pytanie retoryczne, bo bez kodu nikt nic nie wymyśli, a kodu jest zdecydowanie za dużo, żeby tu się znalazł.
Odnalazłem szczyt mojego problemu, jednak go nie rozumiem. Problem jest w interfejsie INotifyPropertyChanged. Od początku:
DataContext mojego ListView to ObservableCollection<MyClass>, i tą kolekcję chcę zserializować. Mój ListView jako ItemTemplate ma UserControl, którego zmienna myClass jest przybindowana do aktualnego obiektu DataContextu. MyClass Implementuje INotifyPropertyChanged. I teraz: nie da się zserializować mojej kolekcji, gdy jest ona DataContextem mojego ListViewi, a myClass implementuje INotifyPropertyChanged. O co tu biega? Dlaczego gdy usunę implementacje NotifyPropChanged, działa, lub usunę DataContext serializacja też działa. Pomocy. Piszę dużą aplikację, kończył bym już, ale zostało mi zapisanie kolekcji na dysku, w celu otwarcia później.
W załączniku dokładny przykład problemu w przykładowym programie. Proszę o litość i pomoc :).
Błąd jaki otrzymuję:
Typ 'System.ComponentModel.PropertyChangedEventManager' w zestawie 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' nie jest oznaczony jako możliwy do serializacji.
Wybaczcie za tyle postów jeden pod drugim, ale raz się nie zalogowałem i już tak ciągnę do końca tematu.
massther napisał(a)
Zaraz, może zaczniemy od tego co dokładnie chcesz zserializować? Bo ja nie do końca rozumiem który obiekt chcesz serializować.
Samo ObservableCollection<T> powinno dać się zserializować, pod warunkiem że typ T jest serializowalny.
Ciągnąc post pod postem:
Problem można nazwać tak:
Nie zserializujesz kolekcji typu T, jeżeli typ T implementuje INotifyPropertyChanged, a DataContext sprawia, że do jego public event PropertyChangedEventHandler PropertyChanged; jest przypisany PropertyChangedEventManager. Jak sobie z tym poradzić?
Ciekawej jest to, że publikując moje myśli w internecie, dochodzę do cudownych odkryć. Bez tego gorzej idzie myślenie. Wystarczy użyć [field:NonSerialized] na moim evencie z INotifyPropertyChanged i działa. Dziękuję wam za zainteresowanie się tematem, pozdrawiam, i odradzam czytanie wszystkiego, bo szkoda czasu. Btw. polecam serial Pacific ;].