Ignorowanie pól klasy bazowej podczas serializacji

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.

3 thoughts on “Ignorowanie pól klasy bazowej podczas serializacji”

  1. 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.

Leave a Reply

Your email address will not be published.