Ich habe eine Klasse, die ich aufgrund einer Servicemethode übergebe, und diese Klasse hat eine get-only-Eigenschaft:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Ich bekomme eine Ausnahme auf der Serviceseite:
System.Runtime.Serialization.InvalidDataContractException: Keine festgelegte Methode für die Eigenschaft 'Message' vom Typ 'MyNamespace.ErrorBase'.
Ich muss diese Eigenschaft als einzigen Getter haben, ich kann Benutzern nicht erlauben, ihr einen Wert zuzuweisen. Gibt es eine Problemumgehung, die ich verwenden könnte? Oder fehlt mir ein zusätzliches Attribut?
c#
wcf
properties
datacontractserializer
Andrey
quelle
quelle
throw new NotSupportedException()
private set;
Werk haben, wenn Sie[DataContract]
und verwenden[DataMember]
. Wenn Sie sie weglassen, brauchen Siepublic set;
.Auch wenn Sie den Wert nicht aktualisieren müssen, wird der Setter vom WCFSerializer verwendet, um das Objekt zu deserialisieren (und den Wert zurückzusetzen).
Diese SO ist genau das, wonach Sie suchen : WCF DataContracts
quelle
quelle
Wenn Sie nur einen Getter haben, warum müssen Sie die Eigenschaft überhaupt serialisieren? Es scheint, als könnten Sie das DataMember-Attribut für die schreibgeschützte Eigenschaft entfernen, und der Serializer würde die Eigenschaft einfach ignorieren.
quelle
Könnten Sie nicht einfach einen "Do-Nothing" -Setter haben?
Oder ist der DataContract-Serializer auch dabei?
quelle
Eigenschaften mit DataMember-Attribut müssen immer festgelegt werden. Sie sollten ein ähnliches Objekt erneut in die Clientanwendung schreiben, da DataContract-Mitgliedern immer Werte zugewiesen werden können.
quelle
Ich hatte dieses Problem mit ASP.NET MVC und wollte DataContractSerializer verwenden, um die Namen der Elemente in der JSON-Ausgabe steuern zu können. Schließlich habe ich den Serializer über JSON.NET umgestellt, das Eigenschaften ohne Setter (was DataContractSerializer nicht unterstützt) und Eigenschaftsnamensteuerung (was der in JSP.NET MVC integrierte JSON-Serializer nicht unterstützt) unterstützt
[JsonProperty(PropertyName = "myName")]
.quelle
Wenn dies eine praktikable Option ist
ErrorBase
, definieren Sie sie wie folgt , anstatt sie als Basisklasse zu verwenden:Obwohl ein Setter vorhanden ist, kann der Client über den WCF-Kanal nicht darauf zugreifen. Es ist also so, als wäre er privat.
quelle
Wenn Ihr Serializer vom Typ
DataContractJsonSerializer
(oder einem anderenDataContractSerializer
) ist, können Sie ihn auch verwendenDataContractSerializerSettings
im Konstruktor verwenden, wobei dieSerializeReadOnlyTypes
Eigenschaft auf true gesetzt ist.quelle