Korzystając z C # .NET 2.0, mam złożoną klasę danych, która ma [Serializable]
atrybut. Tworzę XMLSerializer
klasę i przekazuję ją do konstruktora:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Otrzymuję wyjątek z informacją:
Wystąpił błąd odzwierciedlający typ.
Wewnątrz klasy danych znajduje się inny obiekt złożony. Czy to również musi mieć ten [Serializable]
atrybut, czy poprzez umieszczenie go na najwyższym obiekcie, czy rekurencyjnie stosuje go do wszystkich obiektów w środku?
IList
było to konieczneList
.Pamiętaj, że serializowane klasy muszą mieć domyślne (tj. Bez parametrów) konstruktory. Jeśli w ogóle nie masz konstruktora, w porządku; ale jeśli masz konstruktor z parametrem, musisz również dodać domyślny.
źródło
Miałem podobny problem i okazało się, że serializator nie potrafił rozróżnić dwóch klas o tej samej nazwie (jedna była podklasą drugiej). Wewnętrzny wyjątek wyglądał tak:
„Typy BaseNamespace.Class1” i „BaseNamespace.SubNamespace.Class1” oba używają nazwy typu XML „Class1” z przestrzeni nazw ”. Użyj atrybutów XML, aby określić unikalną nazwę XML i / lub przestrzeń nazw dla typu.
Gdzie BaseNamespace.SubNamespace.Class1 jest podklasą BaseNamespace.Class1.
Musiałem dodać atrybut do jednej z klas (dodałem do klasy podstawowej):
Uwaga: jeśli masz więcej warstw klas, musisz również dodać do nich atrybut.
źródło
Pamiętaj również, że
XmlSerializer
nie można serializować właściwości abstrakcyjnych. Zobacz moje pytanie tutaj (do którego dodałem kod rozwiązania) ..Serializacja XML i typy dziedziczone
źródło
Najczęstsze powody przeze mnie:
źródło
Wszystkie obiekty na wykresie serializacji muszą być możliwe do serializacji.
Od
XMLSerializer
jest to blackbox, sprawdź te linki, jeśli chcesz dalej debugować w procesie serializacji.Zmiana, gdzie XmlSerializer wyprowadza zestawy tymczasowe
W JAKI SPOSÓB: Debugować w wygenerowanym zestawie .NET XmlSerializer
źródło
Jeśli potrzebujesz obsługiwać określone atrybuty (np. Słownik lub dowolną klasę), możesz zaimplementować interfejs IXmlSerialiable , który zapewni większą swobodę kosztem bardziej szczegółowego kodowania .
Jest ciekawy artykuł , który pokazuje elegancki sposób implementacji wyrafinowanego sposobu „rozszerzenia” XmlSerializer.
Artykuł mówi:
Ponieważ to sugeruję zaimplementować własne
IXmlSerializable
klasy, aby uniknąć zbyt skomplikowanych implementacji.... implementacja naszej
XmlSerializer
klasy niestandardowej za pomocą odbicia może być prosta .źródło
Odkryłem, że klasy Dictionary w .Net 2.0 nie można serializować przy użyciu XML, ale dobrze serializuje, gdy używana jest serializacja binarna.
Znalazłem pracę wokół tutaj .
źródło
Niedawno dostałem to w częściowej klasie referencji internetowych podczas dodawania nowej właściwości. Klasa automatycznie wygenerowana dodawała następujące atrybuty.
Musiałem dodać podobny atrybut z rzędem wyższym niż ostatni w sekwencji generowanej automatycznie i to mnie naprawiło.
źródło
Właśnie dostałem ten sam błąd i odkryłem, że
IEnumerable<SomeClass>
problemem była właściwość typu . Wygląda na to, żeIEnumerable
nie można go serializować bezpośrednio.Zamiast tego można użyć
List<SomeClass>
.źródło
Ja również myślałem, że atrybut Serializable musiał znajdować się na obiekcie, ale chyba, że jestem kompletnym noob (jestem w trakcie sesji kodowania późno w nocy), następujące prace z SnippetCompiler :
Wyobrażam sobie, że XmlSerializer używa refleksji nad właściwościami publicznymi.
źródło
Miałem sytuację, w której Zakon był taki sam dla dwóch elementów z rzędu
.... trochę kodu ...
Kiedy zmieniłem kod, aby zwiększyć kolejność o jeden dla każdej nowej właściwości w klasie, błąd zniknął.
źródło
Otrzymałem ten sam błąd, gdy utworzyłem właściwość o typie danych -
Type
. Wystąpił błąd - wystąpił błąd odzwierciedlający typ. Ciągle sprawdzałem „InnerException” każdego wyjątku z doku debugowania i dostałem konkretną nazwę pola (która byłaType
) w moim przypadku. Rozwiązanie jest następujące:źródło
Należy również pamiętać, że nie można serializować kontrolek interfejsu użytkownika i że każdy obiekt, który chcesz przekazać do schowka, musi być możliwy do serializacji, w przeciwnym razie nie będzie można go przekazać innym procesom.
źródło
Korzystałem z tej
NetDataSerialiser
klasy do serializacji moich klas domen. Klasa NetDataContractSerializer .Klasy domen są współużytkowane przez klienta i serwer.
źródło
Miałem ten sam problem iw moim przypadku obiekt miał ReadOnlyCollection. Kolekcja musi implementować metodę Add, aby była możliwa do serializacji.
źródło
Mam nieco inne rozwiązanie do wszystkich opisanych tutaj do tej pory, więc dla każdej przyszłej cywilizacji jest moja!
Zadeklarowałem typ danych „czas”, ponieważ pierwotny typ to a,
TimeSpan
a następnie zmieniono naString
:jednak faktyczny typ był łańcuchem
przez usunięcie
DateType
właściwościXml
można serializowaćźródło
Lub
źródło