11
votes

Alternative au sérialisateur de la taille du protocoude et de la taille et du temps pour travailler avec des objets graphique

Google Protobuf est un excellent protocole pour sérialiser les objets efficaces, mais ce n'est que Prend en charge la sérialisation des arbres, pas des graphiques (manque de suivi de référence d'objet complet).

Il y a peu de mise en œuvre de Google Idée dans .NET. (c'est-à-dire protocoudf-csharp-port ou protoVARP ), mais le plus intéressant est protobuf-net .

Protobuf-Net est meilleur parce que son architecture s'adapte, à .Net World, et a plusieurs add-ins (pas toujours compatible avec les protobuf originaux, mais très utile).

Un de ce complément est la possibilité d'activer le suivi de référence (option d'asreférence), ce qui permet de sérialiser des graphiques complexes même avec des cycles.

Protobuf-Net V2 inutile est en version bêta et L'option d'asreférence ne fonctionne pas dans des scénarios réels mondiaux . (Sans cette option, tout fonctionne bien, mais sans référence, Tracikng Protobuf-Net n'est pas capable de sérialiser des graphiques et n'est plus sérialisé attrayant).

Il a toujours des bugs:

  • Numéro 196
  • Numéro 213
  • numéro 232
  • numéro 242
  • SO 6294295
  • SO 7219959

    Donc, je ne peux pas utiliser ce grand outil, et je recherche un sérialiseur alternatif qui:

    • est au moins aussi rapide et produit de petites sorties comme protobuf
    • est facile à adopter vers le projet actuel comme protobuf-net
    • permet de sérialiser le graphique comme DatacontractSerializer avec SSEFERVObjectReferences définies sur TRUE
    • est stable non seulement pour des objets simples, mais pour des scénarios mondiaux réels complexes

7 commentaires

De celles; Le numéro 232 est identique à SO 7219959 (c'est-à-dire pas un problème - juste une question, avec une réponse); SO 6294295 a une bonne réponse (c'est-à-dire pas un problème - juste une question, avec une réponse); Les 3 autres concernent le mélange d'une asreférence et d'une héritage (ils sont essentiellement des doublons). Donc, cela revient vraiment à: Avez-vous besoin de celles en combinaison! Je serais intrigué de voir votre scénario du monde réel


Ainsi, 6294295 - J'ai expliqué en commentaire, que ProTobuf-Net ne conserve pas les références de la liste, mais uniquement des références d'éléments. Scénario du monde réel J'ai décrit dans le numéro 242. Je ne comprends pas pourquoi les références ne sont que correctement préservées lorsque l'objet n'a aucun héritage.


(Listes) Si tel est votre plus grand barrière, je peux soutenir ce scénario - il s'agit simplement d'obtenir le temps de le faire (d'autres demandes de mon temps, etc.). Est-ce le problème principal?


(héritage) Je ne peux pas commenter que cela sans le regarder plus (bien sûr, prend du temps)


@MARC, ne le prenez pas personnellement, l'outil Open Source et le travail que vous avez fait est génial. Mais nous parlons de ce que Protobuf-Net est maintenant, pas de ce que cela pourrait être à l'avenir. Maintenant, Protobuf-Net ne prend pas en charge correctement le suivi de référence et n'a pas pu être considéré comme un remplacement pour les sérialisées qui le supporte. Il y a des informations sur le site du projet principal: "J'ai également ajouté une gamme de fonctionnalités communément demandées au-delà de la conception régulière des protobuf, afin de répondre aux demandes de tous les jours de programmeurs .NET (héritage, suivi de référence, etc.) . " Ce n'est pas vrai pour la version actuelle. Les gens devraient savoir ..


Oh, je ne suis pas offensé; P Il y a toujours plus que peut être fait et les modifications apportées ont satisfait beaucoup de scénarios demandés. J'essayais simplement de comprendre vos barrières les plus pressantes, de voir si la jonglerie ma liste de priorités aurait pu aider.


Je suggère de modifier des informations sur le site du projet pour ne pas induire d'erreur d'autres utilisateurs et dire clairement ce que Protobuf-Net V2 Beta est, et ce qu'il peut faire maintenant . Peut-être devriez-vous dire que Certaines fonctionnalités sont expérimentales maintenant ? Il devrait également être des informations claires, que tous les tests de performance ont été effectués sans utiliser ces fonctionnalités expérimentales . Je chercherai de nouvelles sorties et garder mes doigts croisés. S'il vous plaît considérer pour permettre aux autres personnes de contribuer au projet. Ça vaut le coup.


3 Réponses :


2
votes

Nous envisageons MessagePack . Ils prétendent être 4X plus rapides que ProTobuf. Cependant, je ne sais pas s'il prend en charge les graphiques d'objets complets. (Nous n'avons pas cette condition, nous aplatirons réellement les objets que nous utilisons pour la communication) Dans mon scénario, je l'utiliserais pour la communication entre une couche .NET et une couche Delphi (et c'est aussi ce qui me retient, pas de support Delphi :))


3 commentaires

La revendication de vitesse est franchement fausse; J'ai posté une comparaison et je n'ai jamais eu de réponse


Je suis intéressé par la comparaison, je ne pouvais pas le trouver sur votre blog. Y a-t-il un endroit où je peux le regarder?


@COHEN - J'ai vérifié - MessagePack Ne pas prendre en charge l'héritage des objets



8
votes

Bartosz, tandis que cette question est assez ancienne, je pourrais vous recommander de vous recommander et quiconque les mouche dessus pour utiliser Migrant , disponible à partir de la source et de package Nuget . Je suis l'un des co-auteurs.

Il peut être facilement adopté pour même des scénarios compliqués, nous avons essayé de le rendre aussi facile à utiliser possible.

La taille de la sortie est raisonnablement petite. Cela dépend de votre arbre d'objet, bien sûr, mais il peut être comparable à Protobuf-Net. Comme protobuf, il utilise un codage de Varint et de zigzag.

Bien sûr, le migrant résout les problèmes que vous avez mentionnés - il conserve l'ensemble des graphiques d'objets, gère l'héritage, les collections complexes, la tolérance de la version (jusqu'à un certain point), etc.

Conditions de la rapidité Nous essayons d'être comparables avec Protobuf-Net. Il prend en charge la dés / la sérialisation à l'aide de méthodes générées dynamiquement, ce qui est beaucoup plus rapide que des solutions à base de réflexion classique.

Scénarios d'utilisation simples sont disponibles sur le site que j'ai lié, mais le clonage d'objet simple est simple. . xxx

écrire dans le flux est aussi simple.

Bien sûr, pour des types très compliqués, il existe un ensemble de décorateurs de classe (attributs, crochets) faire des choses encore plus intelligentes; -)


2 commentaires

Je soulève la suggestion de Piotr à jeter un coup d'oeil au migrant. Dans mes tests, cela me donne de meilleurs résultats de performance que toutes les autres bibliothèques de sérialisation que j'ai essayé et à ce stade, j'ai essayé la plupart d'entre eux. De plus, je travaille à la contribution des fonctionnalités manquantes de la bonne voie OLS OTOS de l'apporter à pair avec Binaryformatter et NetDataContractSérialiseur en termes de fonctionnalités.


Et nous sommes reconnaissants pour ça! :) Tout le monde est invité à collaborer!



0
votes

Il pourrait être en retard pour répondre à cette question spécifique maintenant, mais je le posterai ici pour une personne qui pourrait rechercher la même chose car le suivi de référence est toujours brisé dans Protobuf-net.

Vous pouvez utiliser une fourchette: Aqlaserializer . Il a beaucoup plus d'améliorations que de simples suivis de référence:

  • Collections imbriquées
  • Bandes multidimensionnelles
  • Cartographie très flexible et extensible

    et beaucoup d'autres.

    Disclaimer: Je suis l'auteur de celui-ci.


0 commentaires