Mam pewną klasę, którą mijam w wyniku metody usługi i ta klasa ma właściwość tylko do pobierania:
[DataContract]
public class ErrorBase
{
[DataMember]
public virtual string Message { get { return ""; } }
}
Otrzymuję wyjątek po stronie usług:
System.Runtime.Serialization.InvalidDataContractException: Nie ustawiono metody dla właściwości „Message” w typie „MyNamespace.ErrorBase”.
Muszę mieć tę właściwość jako jedyny getter, nie mogę pozwolić użytkownikom na przypisywanie jej wartości. Jakieś obejście, którego mógłbym użyć? A może brakuje mi jakiegoś dodatkowego atrybutu?
c#
wcf
properties
datacontractserializer
Andrey
źródło
źródło
throw new NotSupportedException()
private set;
działa, jeśli używasz[DataContract]
i[DataMember]
. Jeśli je pominiesz, potrzebujeszpublic set;
.Nawet jeśli nie musisz aktualizować wartości, funkcja ustawiająca jest używana przez WCFSerializer do deserializacji obiektu (i ponownego ustawiania wartości).
To SO jest tym, czego szukasz: WCF DataContracts
źródło
źródło
Jeśli masz tylko metodę pobierającą, dlaczego w ogóle musisz serializować właściwość. Wygląda na to, że można usunąć atrybut DataMember dla właściwości tylko do odczytu, a serializator po prostu zignoruje tę właściwość.
źródło
Nie mógłbyś mieć po prostu ustawiacza „nic nie rób”?
Czy też barf serializatora DataContract również?
źródło
Właściwości z atrybutem DataMember zawsze wymagają ustawienia. Powinieneś ponownie napisać podobny obiekt w aplikacji klienckiej, ponieważ członkom DataContract zawsze można przypisać wartości.
źródło
Miałem ten problem z ASP.NET MVC i chciałem używać DataContractSerializer, aby móc kontrolować nazwy elementów w danych wyjściowych JSON. Ostatecznie przełączyłem serializator na JSON.NET, który obsługuje właściwości bez metod ustawiających (których DataContractSerializer nie obsługuje) i kontrolę nazwy właściwości (której wbudowany serializator JSON w ASP.NET MVC nie obsługuje) za pośrednictwem
[JsonProperty(PropertyName = "myName")]
.źródło
Jeśli jest to realna opcja, zamiast mieć
ErrorBase
jako klasę bazową, zdefiniuj ją w następujący sposób:Teraz, mimo że setter istnieje, jest niedostępny dla klienta za pośrednictwem kanału WCF, więc jest tak, jakby był prywatny.
źródło
Jeśli twój serializator jest typu
DataContractJsonSerializer
(lub dowolnegoDataContractSerializer
), możesz go również użyćDataContractSerializerSettings
w konstruktorze, zSerializeReadOnlyTypes
właściwością ustawioną na true.źródło