Serializacja ObservableCollection, która jest DataContextem Listview, z nieserializowalnym ItemTempl

0

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ąć?

0

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

0

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?

0

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.

0

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 ;].

1 użytkowników online, w tym zalogowanych: 0, gości: 1