La WCF s'étouffe sur les propriétés sans "set ". Aucune solution de contournement?

j'ai une classe que je passe en raison d'une méthode de service, et cette classe a une propriété get-only:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

je suis l'exception d'un côté service:

Système

.Runtime.Sérialisation.InvalidDataContractException: Aucun méthode pour la propriété 'Message' dans le type ' MyNamespace.ErrorBase".

je dois avoir cette propriété car seulement getter, Je ne peux pas permettre aux utilisateurs d'assigner une valeur. Aucune solution de contournement que je pourrais utiliser? Ou est-ce que je manque un attribut supplémentaire?

88
demandé sur Mafii 2010-02-24 05:29:31

8 réponses

donner Message un getter public mais setter protégé, de sorte que seules les sous-classes (et le DataContractSerializer, parce qu'il trompe :) peut modifier la valeur.

96
répondu rh. 2010-02-24 02:45:08

même si vous n'avez pas besoin de mettre à jour la valeur, le setter est utilisé par le WCFSerializer pour désérialiser l'objet (et re-définir la valeur).

C'est ainsi que vous êtes après: WCF DataContracts

12
répondu Russell 2017-05-23 12:26:20
[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}
7
répondu Rikin Patel 2012-08-06 11:21:40

Si vous avez seulement un getter, pourquoi avez-vous besoin de sérialiser la propriété. Il semble que vous puissiez supprimer L'attribut DataMember pour la propriété en lecture seule, et le serializer ignorerait simplement la propriété.

5
répondu Rob Lambert 2016-09-23 21:18:25

ne pourriez-vous pas avoir un setter" ne rien faire"??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

ou est-ce que le DataContract serializer barf aussi??

3
répondu marc_s 2010-02-24 06:05:08

propriétés avec l'attribut DataMember nécessite toujours set. Vous devez réécrire l'objet simmilar sur l'application client car les membres DataContract peuvent toujours se voir attribuer des valeurs.

2
répondu Jojo Sardez 2010-02-24 06:16:46

j'ai eu ce problème avec ASP.NET MVC et moi voulant utiliser DataContractSerializer afin d'être en mesure de contrôler les noms sur les articles dans la sortie JSON. Finalement je suis passé serializer à JSON.NET, qui supporte les propriétés sans setters (ce que DataContractSerializer ne fait pas) et le contrôle de nom de propriété (ce que le JSON serializer intégré dans ASP.NET MVC doesn't) via [JsonProperty(PropertyName = "myName")] .

2
répondu Thomas Lundström 2011-09-13 09:58:42

si c'est une option viable, alors au lieu d'avoir ErrorBase comme classe de base, définissez-la comme suit:

    public interface IError
    {
        string Message
        {
            [OperationContract]
            get;

            // leave unattributed
            set;
        }
    }

maintenant, même si un setter existe, il est inaccessible au client via WCF channel, donc c'est comme s'il était privé.

2
répondu Gilad 2012-10-20 01:01:43