protobuf-net utilise un modèle de stratégie; au besoin (une seule fois par type), il utilise la réflexion pour regarder les types, et construit un ensemble de sérialiseurs (basés sur une interface commune) qu'il peut utiliser pour sérialiser et désérialiser - donc lorsqu'il est utilisé l'ensemble connu de sérialiseurs.
À l'intérieur cela, il essaie de faire un usage raisonnable de la réflexion quand on parle aux membres; il utilise Delegate.CreateDelegate
pour parler aux propriétés, et DynamicMethod
(et IL personnalisé) pour parler aux champs (si possible, cela dépend de la structure cible). Cela signifie qu'il parle toujours à connu types de délégués, plutôt que seulement DynamicInvoke
(ce qui est très lent).
Sans fou, le code a quelques Optimisations (sans doute au détriment de la lisibilité) en termes de:
- tampon locale
byte[]
(des entrées/flux de sortie)
- en utilisant de taille fixe des tableaux (plutôt que des listes, etc.); peut-être trop
- en utilisant les médicaments génériques pour éviter la boxe
- nombreux tweaks/twiddles/etc autour des boucles de traitement binaire
Avec le recul, je pense que je fait une erreur sur le point de médicaments génériques; la complexité signifiait que forçant génériques dans le système bent it out of shape in a few places, et provoque activement certains problèmes majeurs (pour les modèles complexes) on compact framework.
J'ai quelques dessins (dans ma tête seulement) à l'aide de ce refactoriser non interfaces -Générique, et à la place (pour les cadres appropriés) d'utiliser davantage ILGenerator
(mon premier choix aurait été Expression
, mais que les forces une version cadre supérieure). Le problème, cependant, est que cela va prendre beaucoup de temps pour travailler, et jusqu'à très récemment I've been pretty swamped.
Récemment, j'ai réussi à start spending some time on protobuf-net again, donc j'espère que je vais effacer mon arriéré de demandes etc et commencer sur ce bientôt. Il est également mon intention de le faire fonctionner avec les modèles autres que la réflexion (c'est-à-dire en décrivant le mappage de fil séparément).
et ne produit aucun code
produit Je ne dois aussi préciser qu'il existe deux (en option) des itinéraires Codegen si vous souhaitez utiliser le code généré; protogen.exe, ou le VS add-in, permettent la génération de code à partir d'un fichier .proto.Mais ce n'est pas nécessaire - il est utile surtout si vous avez un fichier .proto existant, ou si vous avez l'intention d'interopérer avec un autre langage (C++ etc) pour le développement en premier.
Avez-vous essayé de lire la source? Ou même demander directement à Mark? – Lazarus
J'ai essayé et même eu quelques idées mais si quelqu'un peut donner une réponse rapide ce serait bien – MichaelT
Je serai heureux d'en parler pendant des heures ;-p Mais il faudra attendre que je finisse de travailler ... –