Ik heb een klasse die ik doorgeef als resultaat van een servicemethode, en die klasse heeft een alleen-get-eigenschap:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Ik krijg een uitzondering aan de servicekant:
System.Runtime.Serialization.InvalidDataContractException: Geen set
methode voor eigenschap ‘Message’ in type ‘MyNamespace.ErrorBase’.
Ik moet deze eigenschap hebben als enige getter, ik kan niet toestaan dat gebruikers er een waarde aan toekennen. Enige oplossing die ik zou kunnen gebruiken? Of mis ik een extra kenmerk?
Antwoord 1, autoriteit 100%
Geef Bericht een openbare getter maar beschermde setter, zodat alleen subklassen (en de DataContractSerializer, omdat deze vals speelt 🙂 de waarde kunnen wijzigen.
Antwoord 2, autoriteit 12%
Zelfs als u de waarde niet hoeft bij te werken, wordt de setter door de WCFSerializer gebruikt om het object te deserialiseren (en de waarde opnieuw in te stellen).
Dit is wat je zoekt:
WCF-gegevenscontracten
Antwoord 3, autoriteit 10%
[DataMember(Name = "PropertyName")]
public string PropertyName
{
get
{
return "";
}
private set
{ }
}
Antwoord 4, autoriteit 5%
Kun je niet gewoon een “do-niets” setter hebben??
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message
{
get { return ""; }
set { }
}
}
Of doet de DataContract-serializer dat ook niet??
Antwoord 5, autoriteit 5%
Als je alleen een getter hebt, waarom zou je dan de eigenschap moeten serialiseren. Het lijkt erop dat je het DataMember-kenmerk voor de alleen-lezen eigenschap zou kunnen verwijderen, en de serializer zou de eigenschap gewoon negeren.
Antwoord 6, autoriteit 2%
Voor eigenschappen met het kenmerk DataMember is altijd een set vereist. U moet een soortgelijk object opnieuw schrijven in de clienttoepassing, aangezien aan DataContract-leden altijd waarden kunnen worden toegewezen.
Antwoord 7, autoriteit 2%
Ik had dit probleem met ASP.NET MVC en ik wilde DataContractSerializer gebruiken om de namen van de items in de JSON-uitvoer te kunnen beheren. Uiteindelijk schakelde ik serializer over naar JSON.NET, dat eigenschappen ondersteunt zonder setters (wat DataContractSerializer niet doet) en eigenschapsnaambeheer (wat de ingebouwde JSON-serializer in ASP.NET MVC niet doet) via [JsonProperty(PropertyName = "myName")]
.
Antwoord 8, autoriteit 2%
Als het een haalbare optie is, definieer het dan als volgt in plaats van ErrorBase
als basisklasse:
public interface IError
{
string Message
{
[OperationContract]
get;
// leave unattributed
set;
}
}
Ook al bestaat er een setter, deze is niet toegankelijk voor de klant via het WCF-kanaal, dus het is alsof het privé is.