如何在WCF中将通用列表从客户端传递到服务器?

时间:2011-08-02 16:29:09

标签: silverlight wcf list generics serialization

我在服务器端使用NHibernate查询数据,然后我创建了一个WCF服务,它是发布这些NHibernate对象的服务,它们被正确序列化为Silverlight,我在我的应用程序中修改它们但是当我将它们发送回服务器再次进行血清化,通用列表转换为数组,所以我不能再在服务器端修改它们了......

这是我的班级定义

public class BIMenu
{
    public virtual Guid ID { get; set; }
    public virtual String DisplayName { get; set; }
    public virtual String ProgramToCall { get; set; }
    public virtual IList<BIMenu> Children { get; set; }
    public virtual IList<BISecurityProfile> SecurityProfiles { get; set; }
    public virtual Boolean IsApplication
    {
        get
        {
            if (Children.Count < 1 && ProgramToCall != null)
                return true;
            return false;
        }
    }
    public virtual Boolean IsFolder
    {
        get
        {
            return !IsApplication;
        }
    }

    public BIMenu()
    {
        Children = new List<BIMenu>();
        SecurityProfiles = new List<BISecurityProfile>();
    }
}

这是我的合同

    [ServiceContract]
public interface IBISecurityService
{
    [OperationContract]
    BIMenu GetMenu(String Name);

    [OperationContract]
    void SaveMenu(BIOnline.Model.BIMenu Menu);

    [OperationContract]
    void DeleteMenu(BIOnline.Model.BIMenu Menu);
}

1 个答案:

答案 0 :(得分:1)

您的BIMenu课程是否标有[DataContract]?我希望它是:

[DataContract]
public class BIMenu
{
  [DataMember]
  public virtual Guid ID { get; set; }
  [DataMember]
  public virtual String DisplayName { get; set; }
  [DataMember]
  public virtual String ProgramToCall { get; set; }
  [DataMember]
  public virtual IList<BIMenu> Children { get; set; }
  [DataMember]
  public virtual IList<BISecurityProfile> SecurityProfiles { get; set; }

此外,如果您的IList<BIMenu> ChildrenIList<BISecurityProfile> SecurityProfiles属性设置为Array类型的实例,则完全有效,因为Array实现IList }。如果您想将它们保留为实际的List<>个实例,那么只需将属性定义为List<>而不是IList<>,如下所示:

// Defined as actual Lists, not IList interfaces.
[DataMember]
public virtual List<BIMenu> Children { get; set; }
[DataMember]
public virtual List<BISecurityProfile> SecurityProfiles { get; set; }