Ce qui ne l'ProtoInclude attribut moyenne (en protobuf-net)
Dans le ProtoBuf-Net mise en œuvre, ce qui ne l' ProtoInclude attribut veux dire, et pour quoi faire?
Un exemple serait appréciée.
Je l'ai vu dans ce post et je ne suis pas sûr de ce qu'il fait. L'exemple a été:
[Serializable,
ProtoContract,
ProtoInclude(50, typeof(BeginRequest))]
abstract internal class BaseMessage
{
[ProtoMember(1)]
abstract public UInt16 messageType { get; }
}
[Serializable,
ProtoContract]
internal class BeginRequest : BaseMessage
{
[ProtoMember(1)]
public override UInt16 messageType
{
get { return 1; }
}
}
Aussi, est-il un moyen de générer un tel héritage à l'aide de la protogen outil?
- Re manquant, le commentaire; je reçois: voir ici: meta.stackexchange.com/questions/27677/...
Vous devez vous connecter pour publier un commentaire.
Désolé, je ne voulais pas manquer ce un - hélas, je ne vois pas du tout.
Donné les détails de la question, je vais supposer que vous êtes au moins passingly familiariser avec .proto; corrigez-moi si je me trompe.
[ProtoInclude]
fonctionne un peu comme[XmlInclude]
pourXmlSerializer
- ou[KnownType]
pourDataContractSerializer
- il permet de reconnaître les sous-classes d'un type au cours de la (dé)sérialisation. La seule chose, c'est qu'il a besoin d'un tag (numéro) pour identifier chaque sous-type (qui doit être unique, et de ne pas couvrir tous les champs du type parent).Re protogen: non; le sous-jacent spec (par google) ne prévoit pas pour l'héritage à tous les, donc protogen (par .proto) n'a pas de mécanisme pour exprimer cela. protobuf-net fournit l'héritage de soutien extension, mais il le fait dans une manière qui laisse tout de même les messages du fil-compatible avec les autres implémentations. D'une simple pression, peut-être je pourrais ajouter protogen soutien par l'intermédiaire de la nouvelle extension de propriétés dans le google spec, mais je n'ai pas fait encore.
Donc, à l'exemple; qui exprime une relation d'héritage entre
BaseMessage
etBeginRequest
; indépendamment du fait que vous n':BaseMessage
) et de travailler vers le haut; ce qui n'est pas exactement vrai - il écrit la données de départ avecBeginRequest
(alors qu'il sait que nous avons unBeginRequest
le plus tôt possible lors de la désérialisation). La chose importante est que les champs à partir de n'importe quel parent types de contrat est inclus, et le sérialiseur regarde le réelle objet passé en pas seulement le type de dire il est.De même, au cours de deserilaization, indépendamment du fait que vous utilisez:
vous obtiendrez le type que vous avez fait sérialisé (sans doute un
BeginRequest
).Sous le capot, pour des raisons de compatibilité (avec le protocole tampons de spécification), ce qui est similaire à l'écriture de quelque chose comme (pardonner toutes les erreurs, mes .proto est rusty):
(le remplacement ne devrait probablement pas spécifier
[ProtoMember]
, btw.Normalement, il serait d'écrire les champs dans l'ordre croissant de la balise de l'ordre, mais pour assurer le rendement de la désérialisation le moteur sans-gêne choisit d'écrire la sous-classe des données première (ce qui est explicitement autorisé par la spec) - c'est à dire qu'il écrit quelque chose comme (vous aurez à imaginer le binaire...):
(dans ce cas, le corps de la sous-message est vide)
Ne fait que couvrir?