Jak serializować interfejsy w C#?

XMLSerializer jest bardzo wygodnym sposobem zapisu klas w formie pliku XML. Rozważmy następujący przykład:

public interface IData
{
    // jakies dekleracje
    string Text{get;set;}
}
public class Data: IData
{
    public string Text{get{...}set{...}}
}
public class ClassA
{
    public IData Data{get;set;}
}

Niestety po próbie serializacji dostaniemy wyjątek mówiący, że nie można zapisywać interfejsu. Jaka jest odpowiedź na pytanie zadanie w poście? NIE da się!

W poście mam zamiar pokazać wyłącznie pewne sposoby obejścia tego – dalekie od ideału. Po pierwsze możemy stworzyć klasę abstrakcyjną zamiast interfejsu:

public abstract class DataBase
{
    // jakies dekleracje
    public abstract string Text{get;set;}
}
public class Data: DataBase
{
    public override string Text{get{...}set{...}}
}
public class ClassA
{
    public DataBase Data{get;set;}
}

Oczywiście ma to swoje wady – możemy dziedziczyć tylko po jednej klasie (klasa abstrakcyjna jest typem) itp. Jednak dzięki temu możemy obejść wymogi XMLSerialzer i wciąż mieć bazowy “interfejs”. Jeśli jednak w innych miejscach kodu wciąż chcemy odwoływać się za pomocą interfejsu możemy dodać do naszej hierarchii również interfejs:

public interface IBase
{
    string Text[get;set;}
}
public abstract class DataBase:IBase
{
    // jakies dekleracje
    public abstract string Text{get;set;}
}
public class Data: DataBase
{
    public override string Text{get{...}set{...}}
}
public class ClassA
{
    public DataBase Data{get;set;}
}

Niestety jest to jeden z tych postów, który nie dostarcza odpowiedzi na postawione pytanie Uśmiech. Po prostu jej nie ma… Jeśli faktycznie jest to niezbędne w architekturze pozostaje tylko rozszerzenie lub napisanie od nowa własnego serializatora.

4 thoughts on “Jak serializować interfejsy w C#?”

  1. Jest jeszcze jedna metoda, którą można uznać za “znośną” otóż możesz klasę w której jest interfejs rozszerzyć o System.Xml.Serialization.IXmlSerializable i samodzielnie zadbać o jej serializację i deserializację.

    Pozdrawiam,
    Grzegorz Wiśniewski

  2. @Jarek Żeliński:
    Bardzo czesto klasa ktora chce zapisac zawiera wlasciwosci zawierajace w deklaracji interfejsy. W koncu interfejsy zwiekszaja elastycznosc (poprzez DI itp.) i sa naturalnym elementem dzisiaj. Akademicki przyklad to czesci komputera ktore imlementuja jeden jakis interfejs np. IHardware. Jesli chcemy potem zapisac do pliku caly zestaw nie unikniemy interfejsow. Teoretyczny przyklad ale osobiscie dosc niedawno napotkalem znow podobny problem w praktyce.
    @Grzegorz.W
    Tak ale to juz rozszerzenie o ktorym napisalem na koncu posta – troche dodatkowej roboty.
    @Maciej Aniserowicz
    Dzieki za info. XML jednak ma swoje zalety, zwlaszcza w aplikacjach desctop… Chodz jest to alternatywa bo wciaz koncowy plik mozna “recznie” edytowac.

Leave a Reply

Your email address will not be published.