Wcf, сериализация, член только для чтения - PullRequest
2 голосов
/ 20 января 2011

Я изучаю 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();

Итак, естественно, когда я пытаюсь создать ссылку на мой «неисправный» сервис, я получаю исключение «Нет набора для DRes», которое понято. Но как реализовать шаблон поля «только для чтения» в объекте значения, используемом для индикатора результата?

Ответы [ 2 ]

3 голосов
/ 20 января 2011

Это связано с тем, что сервисы совместно используют схему и контракт, а не класс.

Сказав это, вы можете взломать его, выполнив:

[DataMember]
public DefinedResults DRes 
{
    get { return this.dres; }
    private set { /* NOOP */ }
}
1 голос
/ 20 января 2011

При использовании WCF объект значения отсутствует. Весь объект, полученный и отправленный операцией, должен быть сериализуемым - должен иметь конструктор без параметров (как отметил Марк в комментарии, это не обязательно для DataContractSerializer), и все сериализованные поля должны быть доступны для записи. Если вы хотите отправить объект, который не сериализуем, вы можете реализовать IDataContractSurrogate или просто реализовать свой собственный объект передачи данных (DTO).

...