Saya memiliki beberapa kelas yang saya lewati sebagai hasil dari metode layanan, dan kelas itu memiliki properti get-only:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Saya mendapatkan pengecualian di sisi layanan:
System.Runtime.Serialization.InvalidDataContractException: Tidak ada metode yang ditetapkan untuk properti 'Message' dalam jenis 'MyNamespace.ErrorBase'.
Saya harus menjadikan properti ini sebagai pengambil saja, saya tidak dapat mengizinkan pengguna untuk menetapkan nilainya. Ada solusi yang bisa saya gunakan? Atau apakah saya kehilangan beberapa atribut tambahan?
c#
wcf
properties
datacontractserializer
Andrey
sumber
sumber
throw new NotSupportedException()
private set;
karya jika Anda menggunakan[DataContract]
dan[DataMember]
. Jika Anda menghilangkannya, Anda membutuhkannyapublic set;
.Bahkan jika Anda tidak perlu memperbarui nilai, penyetel digunakan oleh WCFSerializer untuk deserialisasi objek (dan menyetel ulang nilainya).
SO ini adalah apa yang Anda kejar: WCF DataContracts
sumber
sumber
Jika Anda hanya memiliki getter, mengapa Anda perlu membuat serial properti sama sekali. Sepertinya Anda bisa menghapus atribut DataMember untuk properti read-only, dan serializer akan mengabaikan properti tersebut.
sumber
Tidak bisakah Anda memiliki setter "tidak melakukan apa-apa" ??
Atau apakah barf serializer DataContract juga?
sumber
Properti dengan atribut DataMember selalu memerlukan set. Anda harus menulis ulang objek serupa pada aplikasi klien karena anggota DataContract selalu dapat diberi nilai.
sumber
Saya memiliki masalah ini dengan ASP.NET MVC dan saya ingin menggunakan DataContractSerializer agar dapat mengontrol nama pada item dalam output JSON. Akhirnya saya beralih serializer ke JSON.NET, yang mendukung properti tanpa setter (yang DataContractSerializer tidak) dan kontrol nama properti (yang tidak dimiliki serializer JSON bawaan di ASP.NET MVC)
[JsonProperty(PropertyName = "myName")]
.sumber
Jika ini adalah opsi yang layak, alih-alih menjadikannya
ErrorBase
sebagai kelas dasar, tentukan sebagai berikut:Sekarang, meskipun ada penyetel, itu tidak dapat diakses oleh klien melalui saluran WCF, jadi seolah-olah itu pribadi.
sumber
Jika serializer Anda berjenis
DataContractJsonSerializer
(atau adaDataContractSerializer
), Anda juga dapat menggunakanDataContractSerializerSettings
konstruktor, denganSerializeReadOnlyTypes
properti disetel ke true.sumber