J'ai une classe que je passe à la suite 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 reçois une exception côté service:
System.Runtime.Serialization.InvalidDataContractException: Aucune méthode définie pour la propriété «Message» de type «MyNamespace.ErrorBase».
Je dois avoir cette propriété comme seul getter, je ne peux pas permettre aux utilisateurs de lui attribuer une valeur. Une solution de contournement que je pourrais utiliser? Ou est-ce que je manque un attribut supplémentaire?
throw new NotSupportedException()
private set;
fonctionne si vous utilisez[DataContract]
et[DataMember]
. Si vous les omettez, vous en avez besoinpublic set;
.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 redéfinir la valeur).
Ce SO est ce que vous recherchez: WCF DataContracts
la source
la source
Si vous n'avez qu'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 sérialiseur ignorerait simplement la propriété.
la source
Ne pourriez-vous pas avoir un setter "ne rien faire" ??
Ou est-ce que le sérialiseur DataContract barf à cela, aussi ??
la source
Les propriétés avec l'attribut DataMember doivent toujours être définies. Vous devez réécrire un objet simmilar sur l'application client car les membres DataContract peuvent toujours se voir attribuer des valeurs.
la source
J'ai eu ce problème avec ASP.NET MVC et moi voulant utiliser DataContractSerializer afin de pouvoir contrôler les noms sur les éléments dans la sortie JSON. Finalement, j'ai basculé le sérialiseur vers JSON.NET, qui prend en charge les propriétés sans setters (ce que DataContractSerializer ne fait pas) et le contrôle de nom de propriété (ce que le sérialiseur JSON intégré dans ASP.NET MVC ne fait pas) via
[JsonProperty(PropertyName = "myName")]
.la source
Si c'est une option viable, au lieu d'avoir
ErrorBase
comme classe de base, définissez-la comme suit:Maintenant, même si un setter existe, il est inaccessible au client via le canal WCF, c'est donc comme s'il était privé.
la source
Si votre sérialiseur est de type
DataContractJsonSerializer
(ou autreDataContractSerializer
), vous pouvez également l'utiliserDataContractSerializerSettings
dans le constructeur, avec laSerializeReadOnlyTypes
propriété définie sur true.la source