Kilka odpowiedzi objęły powody, dlaczego warto używać serializacji w ogóle. Wydaje się, że chcesz również wiedzieć, dlaczego konkretna klasa ma atrybut [Serializable]
i zastanawiasz się, dlaczego tak się stało.
W środowisku ASP.NET domyślnym magazynem stanu sesji jest InProc
, który umożliwia przechowywanie dowolnego obiektu jako odniesienia i pozostawienie go na stercie. Jest to najlepiej działający sposób przechowywania stanu sesji, jednak działa on tylko wtedy, gdy używasz pojedynczego wątku roboczego lub jeśli cały stan sesji może zostać odbudowany automatycznie, jeśli wątek roboczy zmienił się (mało prawdopodobne). Dla innych stanów przechowywania stanów (StateServer
i SQL Server
) wszystkie obiekty stanu sesji muszą być przekształcalne do postaci szeregowej, ponieważ silnik ASP.NET najpierw serializuje te obiekty przy użyciu serializacji binarnej przed wysłaniem ich na nośnik pamięci.
W twoim przypadku możesz używać InProc
. Jedną z przyczyn jest nadal oznaczanie wszystkich klas używanych w stanie sesji jako Serializable
i przetestowanie ich w ten sposób, że może zajść potrzeba zmiany tego w przyszłości (na przykład w celu użycia farmy sieci Web). Jeśli nie zaprojektujesz swoich klas stanu sesji, mając na uwadze powyższe, będzie dość trudno przeprowadzić migrację w przyszłości.
Również dlatego, że można usunąć atrybut Serializable
, a program "działa" w jednym środowisku, nie oznacza, że będzie działał w innym środowisku. Na przykład może działać dobrze w przypadku serwera WWW testowego programu Visual Studio (który zawsze korzysta z instancji trybu sesji w stanie InProc
), a nawet w instancji programistycznej IIS, ale wtedy prawdopodobnie produkcja IIS instancji jest skonfigurowana do używania innego trybu przechowywania.
Te różnice w środowisku/konfiguracji niekoniecznie są ograniczone do aplikacji ASP.NET. Są inne silniki aplikacji, które mogą to zrobić lub nawet samodzielne aplikacje, które robią (nie jest trudno zbudować tego rodzaju konfigurowalne środowisko).
Wreszcie, możesz pracować z biblioteką, która może być używana przez różne aplikacje. Niektóre z nich mogą wymagać przechowywania stanu w sposób umożliwiający szeregowanie, a inne nie.
Ze względu na te czynniki często jest to bardzo dobry pomysł, przynajmniej podczas budowania biblioteki, do rozważenia oznaczania prostych klas wartości lub klas zarządzania stanami z [Serializable]
. Należy pamiętać, że zwiększa to wydajność testowania tych klas i istnieją ograniczenia co do serializacji (np. Klasa zawierająca odwołanie do gniazda lub odwołanie do otwartego pliku może nie być dobrym kandydatem do serializacji, ponieważ otwarte zasoby zewnętrzne nie mogą być serializowane) więc nie nadużywaj tego.
Zapytałeś, czy użycie [Serializable]
będzie wolniejsze. Nie, nie będzie. Ten atrybut nie ma bezpośredniego wpływu na wydajność. Jeśli jednak środowisko aplikacji zostanie zmienione, aby serializować obiekt, wówczas tak, wpłynie to na wydajność. To jest serializowanie i deserializacja, która jest wolniejsza niż tylko przechowywanie obiektu na stercie. [Należy zauważyć, że niektóre procedury mogą być zapisane w celu wyszukania atrybutu Serializable
, a następnie wyboru serializacji, ale jest to rzadkie; zazwyczaj jest to podobne do ASP.NET i pozostawione administratorowi lub użytkownikowi, aby zdecydować, czy chcą zmienić nośnik pamięci.]
Czy jest możliwe, że jest przechowywany w SessionState podczas korzystania z Out-of-Proc/SQL? Te tryby sesji wymagają serializacji. – vcsjones
Nie jestem pewien, czy podążam za Twoim pytaniem. Czy rzeczywiście pytasz "dlaczego miałbym kiedykolwiek chcieć serializować obiekt?" –
@Kirk Woll, To jest poprawne – user194076