2010-06-08 21 views
2

Dans ma solution, j'ai créé une classe publique pour stocker de la valeur et je déclare déjà l'attribut [DataContract/DataMember].Est-il nécessaire de déclarer l'attribut [DataMember (Order = n)] sur la méthode publique?

Par exemple,

[DataContract] 
public class MeterSizeInfo 
{ 
    string _meterSizeId; 

    [DataMember(Order = 1)] 
    public string MeterSizeId 
    { 
     get { return this._meterSizeId; } 
     set { this._meterSizeId = value; } 
    } 

    string _meterSizeName; 

    [DataMember(Order = 2)] 
    public string MeterSizeName 
    { 
     get { return this._meterSizeName; } 
     set { this._meterSizeName = value; } 
    } 

}

Puis-je ajouter une autre méthode publique exposant à un projet global. Je me demande si je dois ajouter [DataMember (Order = 3)] pour cela ou non.

[DataMember(Order = 3)] //<--- must declare or not? 
    public string DoSomething() 
    { 
     // do something... 
    } 

Je comprends que si je veux utiliser sérialiseur dans protobuf-net pour sérialiser mes données stockées dans, je dois déclarer les attributs. mais je ne suis pas sûr à ce sujet sur la méthode.

aidez s'il vous plaît. Merci d'avance.

Répondre

1

protobuf-net est un sérialiseur de valeur; il ne sait rien sur les méthodes, sauf pour les propriétés. Si vous utilisez le même type (ou compatible), la méthode sera présente automatiquement, mais cela n'a rien à voir avec protobuf-net (ou toute autre sérialisation).

En ce qui concerne l'ajout d'attributs; avec la version actuelle, il faut généralement quelque chose pour savoir quelles propriétés sérialiser (et surtout: avec quels identifiants). Il est un mode implicite, mais je ne le recommande pas à moins que vous sais vous ne changerez jamais le type à nouveau. Déjà. Du tout.

Dans "v2", vous pouvez supprimer les attributs; vous avez la possibilité d'utiliser un modèle externe pour cela, alors vous pourriez avoir:

var model = TypeModel.Create(); 
model[typeof(MeterSizeInfo)].Add("MeterSizeId", "MeterSizeName"); 

(ne me citez pas l'API exacte, mais quelque chose comme ça)

Vous pouvez ensuite utiliser model.Serialize etc.

0

Non - ne devrait pas être là. Vous ne pouvez pas sérialiser une méthode!

0

Non seulement les propriétés sont lisibles et inscriptibles de cette façon ... donc vous ne pouvez pas ajouter l'attribut pour une méthode.