59 votes

Sérialisation d'objet rapide et compacte dans .NET

Je veux utiliser la sérialisation d'un objet de communiquer sur le réseau entre un Mono serveur et les clients de Silverlight. Il est très important que la sérialisation est efficace de l'espace et assez vite, que le serveur va accueillir plusieurs temps réel jeux.

Quelle technique dois-je utiliser? Le BinaryFormatter ajoute beaucoup de frais généraux à sérialisé de cours (Version, la culture, le nom de la classe, les noms de propriété, etc.) ce n'est pas nécessaire à l'intérieur de cette application.

Que puis-je faire pour que ce soit plus efficace de l'espace?

70voto

Jorge Villuendas Points 1990

Vous pouvez utiliser des tampons de protocole . Je change tout mon code de sérialisation de BinaryFormatter avec compression aux tampons de protocole et j'obtiens de très bons résultats. C'est plus efficace dans le temps et dans l'espace.

Il existe deux implémentations .NET par Jon Skeet et Marc Gravell .

53voto

mythz Points 54874

J'ai quelques points de référence pour le leader .NET sérialiseurs basés sur les Comptoirs de dataset.

Northwind .NET serialization benchmarks

@marcgravell binaire protobuf-net est le plus rapide implémentations comparé ce qui est environ 7 fois plus rapide que Microsoft plus rapide sérialiseur disponible (le XML DataContractSerializer) dans la BCL.

J'ai aussi de maintenir une certaine open-source de haute performance .NET texte sérialiseurs ainsi:

  • JSV TypeSerializer un compact, propre, JSON+CSV format de type de 3,1 x plus rapide que le DataContractSerializer
  • ainsi qu'un JsonSerializer que de 2,6 x plus rapide.

29voto

Marc Gravell Points 482669

Comme l'auteur, je vous invite à essayer protobuf-net; il est livré avec les fichiers binaires pour les deux Mono 2.0 et Silverlight 2.0, et est rapide et efficace. Si vous avez quelque problème que ce soit, envoyez-moi un e-mail (voir mon Stack Overflow profil), le support est gratuit.

Jon version (voir ci-dessus, a accepté de répondre) est également très bon, mais l'OMI le protobuf-net version est plus idiomatique pour C# - Jon serait idéal si vous parliez, C#, Java, donc vous pourriez avoir une API similaire à ses deux extrémités.

8voto

Tomba Points 103

J'ai eu un problème similaire, même si je suis juste à l'aide .NET. J'ai voulu envoyer des données sur Internet aussi rapidement et facilement que possible. Je n'ai pas trouver quelque chose qui serait assez optimisé, j'ai donc fait mon propre sérialiseur, nommé NetSerializer.

NetSerializer a ses limites, mais ils n'affectent pas mon cas d'utilisation. Et je n'ai pas fait de points de référence pour un certain temps, mais il était beaucoup beaucoup plus rapide que n'importe quoi d'autre, j'ai trouvé.

Je n'ai pas essayé sur Mono ou Silverlight. Je serais prêt à parier qu'il fonctionne sur Mono, mais je ne suis pas sûr de ce que le niveau de soutien est pour DynamicMethods sur Silverlight.

4voto

Sean Points 22088

Vous pouvez transmettre les données via DeflateStream ou GZipStream pour les compresser avant leur transmission. Ces classes résident dans l'espace de noms System.IO.Compression .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X