Serializacja case insensitive

0

Siema
Gryzę się z takim problemem: mam klasę, którą chcę serializować i deserializować. Ale dostaję od kogoś pliki, z których ma przebiegać deserializacja. Wszystko jest ok, ale czasem wielkość jednak ma znaczenie ;)
Do sedna: jak zmusić serializer .NETowy żeby był case insensitive? Jak dojść do tego, żeby można było importować pliki bez względu na wielkość liter? Any ideas?

0

Dodaj obsługę pre-serializacji/deserializacji i ręcznie przypisz wartość do właściwej właściwości. Metoda realizująca pre-serializację/deserializację musi być opatrzona atrybutem OnSerializingAttribute/OnDeserializingAttribute, a jej prototyp powinien wyglądać tak:

[OnSerializing]
public void OnSerializeFoo(StreamingContext context)
{
    ...
}

Jeśli dobrze zrozumiałem twój problem to właśnie te mechanizmy powinny ci pomóc. Resztę doczytasz w dokumentacji MSDN.

0

Ale problem jest taki, że wtedy trzeba obsłużyć i serializację i deserializację, z tego co mi wiadomo, prawda? A ja właśnie nie chciałbym za dużo tego kodu pisać, kombinuję więc, jak obsłużyć tylko deserializację, a serializacja żeby przebiegała automatycznie.

0

Jeśli serializujesz XmlSerializerem to możesz zaimplementować interfejs IXmlSerializable. To jedyne rozwiązanie jakie znam i obawiam się, że jedyne jakie w tej sytuacji sprawdzi się.

0
pako1337 napisał(a)

Do sedna: jak zmusić serializer .NETowy żeby był case insensitive? Jak dojść do tego, żeby można było importować pliki bez względu na wielkość liter? Any ideas?

Ale nazwy elementów klas masz np. w pliku samymi małymi literami, a w rzeczywistości maja np. notację wielbłądzią?
Czy wiesz co jak powinno wyglądać? Może po prostu trzeba użyć find & replace?

0

W klasie mam zwykłą, .NETowo - C#ową notację, czyli wielbłądki. A w plikach xml mogę mieć dowolne coś. Znaczy w klasie będize WlasciwoscWazna, a w pliku moze być: wlasciwoscwazna, WLASCIWOSCWAZNA, WlasciwoscWazna, albo nawet wLaScIwOsCwAzNa. I muszę się uniezależnić od tego w jak najwydajniejszy i jak najprostszy sposób w momencie deserializacji.
Niby można potraktować wszystkie znaczniki ToUpper() i byłoby ok, ale to rozwiązanie nie jest najładniejsze. Można też napisać własne funkcje które będą pisały i czytały xmla, ale to robienie koła od nowa trochę, chociaż wtedy miałoby się pełną kontrolę. I tak kombinuję, bo może ktoś zna jakiś knif jednak :)

Tak to jest, jak pliki udają, że są XMLami, a w rzeczywistości wcale nie są.

0

Nie ma innego sposobu, nie ma żadnego magicznego przełącznika, który wyłączy case sensitive. Musisz zatem zdecydować się na któryś z zaproponowanych sposobów. Zatem albo czeka cię przetwarzanie pliku Xml i korekta nazw (jak zaproponował somekind), albo implementacja kontroli nad serializacją i ręczne dopasowywanie elementów (taka metodę wybrałbym ja).

0

a ja bym postaral sie przekonac kogos, kto wymyslil opcje wLaScIwOsCwAzNa WLASCIWOSCWAZNA oraz wlasciwoscwazna ze jest to nierealne, i wskazal na ten dorbny fakt ze sam w sobie XML jest juz case-sensitive..

chyba ze to nie xml tylko html?:>

ewentalnie zaproponowac zeby nazwy w xml byly zapisywane z myslnikami, np. wlasciwosc-wazna wLaScIwOsC-wAzNa i sobie to samemu przed deserializacja przetworzyc na camelcoding..

---------edit:
aaaalternatywnieeeee ale to juz naprawde w ostatecznosci, jesli masz bardzo wiele pol w klasach do obsluzenia i naprawde nie mozesz wymusic sensownego xml'a ani tez totalnie nie chce Ci sie pisac ser/deser recznie:

przygotuj sie merytorycznie do deserializacji: zdobadz zbior nazw klas ktore musisz umiec odczytac, np. poprzez reflection. Umiesc to w set<string> z wlasnym equalitycomparer<string> ktory bedzie porownywal case-insensitive. Kontroluj owo "umieszczanie" - jesli trafisz na jakakolwiek kolizje: koniec, przypadek juz zmarł, nie da sie jednoznacznie określić co własciwie odczytujesz [chyba ze bedziesz kontrolowac takze nazwy pol i castowalnosc...]

nastepnie, odczytaj XML jako xml, nie wazne czy DOM czy SAX [xmldocument vs xmlreader]
przelec rekurncyjnie po kazdym element, i kolejno badaj czy rzeczone nazwy sa w twoim SET. jesli ktoras jest w nim, odbierz ja z set ---- odbierzesz swoja oryginalna nazwe, poprawna ---- i podmien w XML'u nazwe na nazwe z set'a

tak przygotowany XML bedzie w oczywisty sposob idealnie "pasowal".
jedyny wymog: nazwy musza byc unikatowe w sensie case-insensitive. zadna odczytywana klasa nie moze definiowac nowego InT jesli juz INT istnial

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