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?
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.
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.
@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:
- JSV TypeSerializer a compact, czysty, podobny do JSON + CSV format, który jest 3,1 x szybszy niż DataContractSerializer
- oraz JsonSerializer to 2,6 x szybciej.
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.
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.
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 .
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.
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...".
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.)
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