Klasa XmlSerializer służy do serializacji całych klas. Za pomocą atrybutu XmlIgnore można wykluczyć właściwości, których nie chcemy zapisywać. Problem pojawia się gdy w klasie pochodnej chcemy wykluczyć jakieś pola z klasy bazowej tj.:
class Employee { public string FirstName { get; set; } } class Manager:Employee { //... }
Serializaując Employee chcemy zapisać FirstName. Z kolei serializując Manger nie chcemy już tego robić. Jak uzyskać taki efekt? Dodając atrybut XmlIgnore w Employee spowodujemy, że dla wszystkich instancji pole będzie ignorowane.
XmlSerializer wspiera jednak pola bool, które określają czy należy dane pole zapisywać czy nie. Na przykład, aby zignorować FirstName w Manager wystarczy:
class Employee { [XmlIgnore] public bool FirstNameSpecified = true; public string FirstName { get; set; } } class Manager:Employee { public Manager() { FirstNameSpecified = false; } //... }
Wystarczy stworzyć pole, według wzorca NazwaPolaSpecified. XmlSerializer rozpoznaje takie zmienne i w przypadku gdy mają wartość false, serializacja jest ignorowana. Pola Specified dają większą kontrolę ponieważ można decydować o serialziacji w czasie wykonywania programu a nie kompilacji. Ważne aby oznaczyć Specified atrybutem XmlIgnore ponieważ jest to pole publiczne i bez tego zostałoby zapisanie tak jak inne publiczne dane.
Ja od siebie dodam bardzo fajny i zarazem podobny atrybut [ScriptIngore], który pozwala ominąć atrybuty podczas serializacji do JavaScriptu. Przydaje się w webowych aplikacjach. Więcej szczegółów tutaj: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.scriptignoreattribute.aspx
A ja trochę ponarzekam na ten patent. Takie sztywne, narzucone nazewnictwo pól wydaje mi się niezbyt szczęśliwym rozwiązaniem. IMHO lepsza byłaby możliwość wyspecyfikowania nazwy pola/właściwości, która decydowałaby o serializowaniu danej składowej.
@LB:
Zgadza sie. Ale XmlSerializer nie wspiera niczego innego a mowa tutaj wlasnie o nim:)