Je suis peut-être en train de négliger quelque chose, mais j'essaie de lutter contre les tampons de protocole dans une méthode facile pour fournir des extensions plus tard. Cela semble un peu flou, donc je vais sauter directement dans le problème.Tampons de protocole avec des extensions
Je suis en train d'écrire un ensemble pour supporter diverses tâches, dont l'une comprend la description de données structurées. Temps parfait pour utiliser les tampons de protocole. La classe primaire à utiliser les tampons de protocole s'appelle StateDefinition. Voici le fichier .proto je suis venu avec pour elle:
package Kannon.State; message StateDefinition { enum StateTypes { GRAPHICS = 0; AUDIO = 1; MIND = 2; PHYSICS = 3; NETWORK = 4; GENERIC = 5; } repeated StateTypes requiredStates = 1; optional GraphicsStateDef Graphics = 2; optional AudioStateDef Audio = 3; (etc) } message GraphicsStateDef { extensions 100 to max; } message AudioStateDef { extensions 100 to max; } (etc)
Mon objectif était de permettre à ces messages _StateDef soient étendus plus tard avec ce que les champs dont il aurait besoin. Cependant, cette extension serait indépendante de la bibliothèque que j'écris actuellement. Kagents.dll -> Gère l'analyse syntaxique de StateDefinition et ainsi de suite. Quelque chose référençant Kagents.dll -> A un fichier de protobuff avec "extend GraphicsStateDef" pour définir l'état nécessaire. J'espérais que la définition de "extend GraphicsStateDef" génèrerait du code qui me permettrait d'utiliser les propriétés pour accéder à ces champs, et d'éviter la lourde syntaxe "Extendible.AppendValue()" et GetValue().
Une solution j'ai conçu, qui semble hackish, est de définir une classe dans la DLL faisant référence à des méthodes d'extension, comme ceci:
public static class GraphicsExt { enum Fields { someValue = 1, someOtherValue = 2 } public static Int32 someValue(this State.GraphicsStateDef def) { return Extensible.GetValue(def, Fields.someValue); } public static void someValue(this State.graphicsStateDef def, Int32 value) { Extensible.AppendValue(def, fields.someValue, value); } }
Si quelqu'un peut penser à une meilleure façon, je serais bien obligé . =) En outre, je ne suis pas sûr de la clarté de ma description du problème, donc s'il y a des éclaircissements ou des informations supplémentaires que je peux fournir, s'il vous plaît faites le moi savoir. =)
EDIT: Donc, après avoir réfléchi beaucoup à ce sujet et réalisé que j'aborde le problème mal. StateReference est supposé stocker une liste de différents GameState. De même, il stocke une StateDefinition, qui devrait décrire l'état de cette référence d'état. Actuellement, j'essaie de désérialiser les tampons d'état en différentes classes (GraphicsStateDef), alors que je devrais vraiment désérialiser dans les objets d'état eux-mêmes.
Par conséquent, j'ai besoin de repenser la conception de telle sorte que StateDefinition devienne un conteneur pour le flux et extrait seulement assez d'informations pour le champ "StateTypes requiredStates = 1 répété". Ensuite, dans l'assemblage de référencement, le reste du flux peut être désérialisé dans les états respectifs.
Quelqu'un a-t-il des recommandations sur la façon d'aborder cette question? Quelques idées sont en train de se formuler, mais rien de concret, et j'adorerais l'apport des autres.
Utilisez-vous protobuf-net? Y a-t-il des problèmes connus avec la génération de code pour étendre les définitions? – Merritt
Oui, j'utilise protobuf-net. Et non, pas que je sache, je vérifierai bien. Ce n'est même pas un problème de génération de code, c'est que je ne peux pas penser au mécanisme de langage à utiliser pour "terminer" la classe dans un assemblage externe. Les classes partielles fonctionneraient bien, mais refuseraient de franchir la limite de l'assemblée. – Quantumplation
Des pensées sur mon édition? Je ne sais toujours pas comment je veux aborder cela. – Quantumplation