Wcf,序列化,只读成员

时间:2011-01-20 20:13:17

标签: wcf serialization readonly

我正在学习WCF,我今天面临的挑战之一就是实现这个设计:

[DataContract]
public class MyOwnFaultException : FaultException<MyResult> 
{
   public MyOwnFaultException(MyResult result) : base(result) {}
}

[DataContract]
public class MyResult 
{
    readonly DefinedResults dres;

    public MyResult(DefinedResults res) {
        dres = res;
    }

    [DataMember]
    public DefinedResults DRes 
    {
        get { return this.dres; }
        //do not want to have the setter for this, but w.o it .net throws exception
    }
}

[DataContract]
public enum DefinedResults 
{ 
    Success = 0,
    Fail = 1,
}

服务

[OperationContract]
[FaultContract(typeof(MyOwnFaultException))]
void TestRemoteException();

所以,当我尝试创建对我的'错误'服务的引用时,我自然会得到“No Set For DRes member”异常,这是理解的。但是如何将readonly字段模式实现到用于结果指示符的值对象?

2 个答案:

答案 0 :(得分:3)

这是因为服务共享模式和契约,而不是类。

话虽如此,你可以通过以下方式破解它:

[DataMember]
public DefinedResults DRes 
{
    get { return this.dres; }
    private set { /* NOOP */ }
}

答案 1 :(得分:1)

使用WCF时没有值对象。通过操作接收和发送的所有对象必须是可序列化的 - 必须具有无参数构造函数(正如注释中的marc指出的那样,DataContractSerializer不需要)并且所有序列化字段必须是可写的。如果要发送不可序列化的对象,可以实现IDataContractSurrogate或只实现自己的数据传输对象(DTO)。