Szybka i kompaktowa serializacja obiektów in.NET

Chcę używać serializacji obiektów do komunikacji w sieci pomiędzy serwerem Mono a klientami Silverlight. Bardzo ważne jest, aby serializacja była wydajna i dość szybka, ponieważ serwer będzie obsługiwał wiele gier w czasie rzeczywistym.

Jakiej techniki powinienem użyć? BinaryFormatter dodaje wiele napowietrznych do serializowanych klas (Wersja, kultura, nazwa klasy, nazwy właściwości, itp.), które nie są wymagane w ramach tej aplikacji.

Co mogę czy aby to bardziej efektywne miejsce?

Author: Peter Mortensen, 2009-02-14

8 answers

Można używać buforów protokołu . Zmieniam cały mój kod serializacji z BinaryFormatter z kompresją do buforów protokołów i uzyskanie bardzo dobrych wyników. Jest bardziej wydajny zarówno w czasie, jak i w przestrzeni.

Istnieją dwie implementacje.NET autorstwa Jona Skeeta i marca Gravella .

Aktualizacja : Oficjalna implementacja. NET znajduje się tutaj.

 67
Author: Jorge Villuendas Zapatero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 09:55:47

Mam kilka benchmarków dla wiodących serializerów.NET dostępnych w oparciu o zestaw danych Northwind.

Northwind. NET serializacja benchmarki

@marcgravell binarny protobuf-net jest najszybszą implementacją benchmarked, która jest o 7X szybsza niż Microsoft najszybszy dostępny serializer (XML DataContractSerializer) w BCL.

Utrzymuję również niektóre wysokowydajne serializery tekstowe. NET o otwartym kodzie źródłowym:

 52
Author: mythz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-03 04:54:39

Jako autor, zapraszam do wypróbowania protobuf-net ; jest dostarczany z binariami zarówno dla Mono 2.0 i Silverlight 2.0, i jest szybki i wydajny . Jeśli masz jakiekolwiek problemy, po prostu napisz do mnie e-mail (zobacz mój profil przepełnienia stosu); wsparcie jest bezpłatne.

Wersja Jona (zobacz wcześniejszą akceptowaną odpowiedź) jest również bardzo dobra, ale IMO wersja protobuf-net jest bardziej idiomatyczna dla C# - Jona byłaby idealna, gdybyś mówił C # do Javy, więc może mieć podobne API na obu końcach.

 28
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-04 11:08:46

Miałem podobny problem, chociaż właśnie korzystam z .NET. chciałem jak najszybciej i łatwo przesyłać dane przez Internet. Nie znalazłem niczego, co byłoby wystarczająco zoptymalizowane, więc zrobiłem swój własny serializer o nazwie NetSerializer .

NetSerializer ma swoje ograniczenia, ale nie wpłynęły one na mój przypadek użycia. I nie robiłem benchmarków przez jakiś czas, ale było o wiele szybciej niż cokolwiek innego, co znalazłem.

Nie próbowałem na Mono ani Silverlight. Założę się. działa na Mono, ale nie jestem pewien jaki jest poziom wsparcia dla DynamicMethods na Silverlight.

 8
Author: Tomba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-01 06:28:02

Możesz przekazać dane przez DeflateStream lub GZipStream, aby skompresować je przed transmisją. Klasy te żyją w przestrzeni nazw System.IO.Compression .

 4
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-14 13:48:25

Możesz spróbować użyć JSON. Nie jest tak wydajny jak bufory protokołów, ale o wiele łatwiej byłoby monitorować wiadomości za pomocą narzędzi takich jak Wireshark, co bardzo pomaga podczas debugowania problemów. . NET 3.5 jest wyposażony w serializer JSON.

 4
Author: Pablote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 15:17:40

Miałem bardzo podobny problem-zapisywanie do pliku. Ale następujące mogą być również używane przez sieć, ponieważ została ona faktycznie zaprojektowana do remotowania.

Rozwiązaniem jest użycie biblioteki Simona Hewitta-Zobacz Optymalizacja Serializacja w. NET-część 2.

Część 1 artykułu stanowi (pogrubienie jest moim akcentem): "... Jeśli kiedykolwiek korzystałeś z. NET remoting dla dużych ilości danych, przekonasz się, że istnieją problemy z skalowalność. Za niewielkie kwoty danych, działa dobrze wystarczy, ale większe ilości zajmują dużo procesora i pamięci, generuje ogromne ilości danych do transmisji, oraz może zawieść bez wyjątków od pamięci. Istnieje również duży problem z czasem poświęconym na rzeczywiste wykonanie serializacja - duża ilość danych może sprawić, że stanie się to niewykonalne do użytku w aplikacjach ...."

Otrzymałem podobny wynik dla mojego konkretnego zastosowania, 40 razy szybsze oszczędzanie i 20 razy szybsze ładowanie (od minut do sekund). Wielkość serializowane dane były również znacznie zredukowane. Nie pamiętam dokładnie, ale to było co najmniej 2-3 razy.

Jest to dość łatwe do rozpoczęcia. Jednak jest jeden gotcha: używaj tylko serializacji. NET dla najwyższych struktura danych poziomu (aby uzyskać serializację/deserializację rozpoczęte), a następnie wywołanie serializacji/deserializacji funkcje bezpośrednio dla pól na najwyższym poziomie struktura danych. W przeciwnym razie nie będzie żadnego przyspieszenia... Na przykład, jeśli dana struktura danych (powiedz Generic.List) nie jest obsługiwana przez bibliotekę, a następnie. NET serializacja będzie używana zamiast tego i jest to Nie-Nie. Zamiast serializuj listę w kodzie klienta (lub podobnym). Na przykład zobacz w pobliżu "' to jest nasze własne kodowanie."w tej samej funkcji jak podano poniżej.

Dla odniesienia: kod z mojej aplikacji - patrz w pobliżu " uwaga: to jedyne miejsce, w którym używamy wbudowanego .NET...".

 3
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 09:21:05

Możesz wypróbować BOIS, który koncentruje się na wielkości spakowanych danych i zapewnia najlepsze opakowanie do tej pory. (Nie widziałem jeszcze lepszej optymalizacji.)

Https://github.com/salarcode/Bois

 2
Author: Salar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 15:55:11