2010-04-14 13 views
27

Sądzę, że dodanie tego atrybutu do interfejsu byłoby pomocne, aby nie tworzyć klas korzystających z interfejsu i nie można ich przekształcać w seriale.Dlaczego interfejsy nie [Serializable]?

To może być bardzo podstawowe pytanie, ale chciałem zapytać ekspertów.

+0

Yous powinien sprawdzić tę odpowiedź, jeśli chcesz uzyskać http: // stackoverflow.com/questions/1333864/xml-serialization-of-interface-property – juharr

Odpowiedz

65

Interfejsy definiują umowę i nie mają żadnego własnego stanu.

Serializacja dotyczy zapisywania i wczytywania stanu do iz modelu obiektu.

Nie ma sensu serializować czegoś, co nie ma stanu.


Aby odpowiedzieć na pytanie, zmuszając praktyczną implementację interfejsu być Serializable - to dlaczego interfejs ISerializable istnieje.

W .NET można zadeklarować interfejs, który powinien realizować inne interfejsy:

interface MustBeSerializable : ISerializable {} 

zobaczyć niektóre więcej informacji here.

+0

Niesamowite wytłumaczenie :-) – Raja

+0

Świetne wyjaśnienie. –

+6

Adwokat diabła: interfejsy oznaczają * jak * obiekty działają ze swoim stanem. Interfejsy nie mają stanu, ale będą używane do definiowania obiektów, które robią i kurczą się, w jaki sposób można uzyskać dostęp do państwa. – Dinah

4

Jeśli chcesz, aby wymusić klasy implementujące niestandardowy interfejs IMyInterface być serializacji można określić, że ma:

interface IMyInterface : ISerializable 
{ 
    // Custom interface definition 
} 

to bardziej wyraźnie wskazuje, że klasa powinna wspierać wdrażanie serializacji. Nie eliminuje to konieczności oznaczania klasy atrybutem [Serializable].

IIRC, można również utworzyć niestandardową regułę FxCop, która sprawdza, czy klasy dziedziczące po IMyInterface są oznaczone odpowiednim atrybutem [Serializable], a tym samym usunięcie potrzeby zajęcia implementowania niestandardowej serializacji.

2

Istnieje kilka dobrych, choć ezoterycznych powodów tego, czym jest interfejs, a co nie, co uniemożliwia to. Powiedział jednak: zgadzam się z tobą. Jest wiele rzeczy, które byłyby użyteczne, gdybyśmy mogli włączyć je do interfejsów. [Serializable] i statyki przychodzą na myśl.

Chociaż nie mieszczą się w filozofii tego, czym jest interfejs, zdają się włączać tę pustą szarej strefy do pojedynczego dziedziczenia OOP. Są oczywiście prace dookoła, ale czują się bardzo zmuszeni w porównaniu do pierwotnego zamiaru.

2

Cóż, nie ma powodu, że nowe klasy nie są oznaczone jako serializacji domyślnie: Dodając atrybut Serializable, potwierdzasz, że masz zapewnione, że serializacji w swojej klasie działa, wybierając odpowiednie typy danych dla instancji pola i dodając logikę serializacji, jeśli to konieczne.

Jeśli więc "zapomniałeś" dodać atrybutu Serializable do swojej klasy, najprawdopodobniej zapomniałeś również sprawdzić, czy serializacja naprawdę działa na twojej klasie. Oczywiście, w wielu przypadkach będzie działać "od razu po wyjęciu z pudełka", więc dodanie atrybutu jest wszystkim, co pozostaje, ale powinieneś dokładnie sprawdzić i wyraźnie potwierdzić ten fakt (ręcznie dodając atrybut).

Powiązane problemy