WCF, возможно, проблема, связанная с сериализацией - PullRequest
1 голос
/ 07 февраля 2012

На сервере у меня есть следующий класс

public class A 
{ 
   string a1 {get; set ;}
   string a2 {get; set;}
}

Я определил услугу со следующим контрактом на операцию

[OperationContract]
public list<A> GetAll()
{
    return new List<A> {new A {a1="1", a2="2"}, new A{a1="3", a2="4"}};
}

в ссылке определена мелкая копия A следующим образом

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="GetAll", Namespace="http://schemas.datacontract.org/2004/07/SomeModel")]
[System.SerializableAttribute()]
public partial class A: object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

        [System.NonSerializedAttribute()]
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string A1Field;

        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string A2Field;


        [global::System.ComponentModel.BrowsableAttribute(false)]
        public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
            get {
                return this.extensionDataField;
            }
            set {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string A1{
            get {
                return this.A1Field;
            }
            set {
                if ((object.ReferenceEquals(this.A1Field, value) != true)) {
                    this.A1Field= value;
                    this.RaisePropertyChanged("A1");
                }
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string A2{
            get {
                return this.A2Field;
            }
            set {
                if ((object.ReferenceEquals(this.A2Field, value) != true)) {
                    this.A2Field= value;
                    this.RaisePropertyChanged("A2");
                }
            }
        }


        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }

На клиенте я вызываю сервис. GetAll () и использую поверхностную копию A, определенную в прокси, которая определяет мою модель для представления. вызов похож на

ActionResult GetAll()
{
   List<A> allAs = service.GetAll();
   return new View (allAs);
}

Однако список на клиенте всегда emtpy. В чем проблема?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

В классе вам понадобится атрибут DataContract из System.Runtime.Serialization.DataContractAttribute пространства имен.

Что-то вроде этого

[DataContract]
public class A 
{ 
   [DataMember]
   public string a1 {get; set ;} //This should be public
   [DataMember]
   public string a2 {get; set;}//This should be public
}

Подробнее о MSDN

2 голосов
/ 07 февраля 2012

Вы должны определить свой класс данных, A как контракт данных:

[DataContract]
public class A
{
    [DataMember]
    public string a1 {get; set ;}

    [DataMember]
    public string a2 {get; set ;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...