WCF chokes on properties with no "set ". Any workaround?

C#WcfPropertiesDatacontractserializer

C# Problem Overview


I have some class that I'm passing as a result of a service method, and that class has a get-only property:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

I'm getting an exception on service side:

> System.Runtime.Serialization.InvalidDataContractException: No set > method for property 'Message' in type 'MyNamespace.ErrorBase'.

I have to have this property as only getter, I can't allow users to assign it a value. Any workaround I could use? Or am I missing some additional attribute?

C# Solutions


Solution 1 - C#

Give Message a public getter but protected setter, so that only subclasses (and the DataContractSerializer, because it cheats :) may modify the value.

Solution 2 - C#

Even if you dont need to update the value, the setter is used by the WCFSerializer to deserialize the object (and re-set the value).

This SO is what you are after: https://stackoverflow.com/questions/172681/wcf-datacontracts

Solution 3 - C#

[DataMember(Name = "PropertyName")]
public string PropertyName
{
	get
	{
		return "";
	}
	private set
	{ }
}

Solution 4 - C#

If you only have a getter, why do you need to serialize the property at all. It seems like you could remove the DataMember attribute for the read-only property, and the serializer would just ignore the property.

Solution 5 - C#

Couldn't you just have a "do-nothing" setter??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

Or does the DataContract serializer barf at that, too??

Solution 6 - C#

Properties with DataMember attribute always requires set. You should re write simmilar object on the client application since DataContract members can always be assigned values.

Solution 7 - C#

I had this problem with ASP.NET MVC and me wanting to use DataContractSerializer in order to be able to control the names on the items in the JSON output. Eventually I switched serializer to JSON.NET, which supports properties without setters (which DataContractSerializer doesn't) and property name control (which the built-in JSON serializer in ASP.NET MVC doesn't) via [JsonProperty(PropertyName = "myName")].

Solution 8 - C#

If it's a viable option, then instead of having ErrorBase as the base class, define it as follows:

    public interface IError
    {
        string Message
        {
            [OperationContract]
            get;

            // leave unattributed
            set;
        }
    }

Now, even though a setter exists, it's inaccessible to the client via WCF channel, so it's as if it were private.

Solution 9 - C#

If your serializer is of type DataContractJsonSerializer (or any DataContractSerializer) you can also use DataContractSerializerSettings in the constructor, with the SerializeReadOnlyTypes property set to true.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndreyView Question on Stackoverflow
Solution 1 - C#rh.View Answer on Stackoverflow
Solution 2 - C#RussellView Answer on Stackoverflow
Solution 3 - C#Rikin PatelView Answer on Stackoverflow
Solution 4 - C#Rob LambertView Answer on Stackoverflow
Solution 5 - C#marc_sView Answer on Stackoverflow
Solution 6 - C#Jojo SardezView Answer on Stackoverflow
Solution 7 - C#Thomas LundströmView Answer on Stackoverflow
Solution 8 - C#GiladView Answer on Stackoverflow
Solution 9 - C#Aaron ThomasView Answer on Stackoverflow