【问题标题】:WCF Service - Serialize Linq parameterWCF 服务 - 序列化 Linq 参数
【发布时间】:2018-08-17 00:03:11
【问题描述】:

我有一个简单的课程:

[DataContract]
public class Book
{
    [DataMember]
    public Int32 ID { get; set; }

    [DataMember]
    public Nullable<Int32> AuthorID { get; set; }     
}

通过 WCF 服务检索,例如:

public class BookService : IBookService
    {
        IService _service;

        public BookService()
        {
            _service = new BookService();
        }

        public IEnumerable<Book> GetBooks()
        {
            var Books = _service.GetBooks();
            return Books;
        }                
    }

我现在想扩展它以包含一个附加函数,该函数允许 LINQ 查询包含 Book 类的附加属性(在上面的缩减示例中未显示)。此功能(在 MVC 应用程序中包含和调用时有效)是:

    public IEnumerable<Book> GetBooks(params Expression<Func<Book, object>>[] includes)
    {
        var Books = _service.GetBooks(Expression<Func<Book, object>>[]>(includes));
        return Books;
    }

但是,当从 WCF 服务运行时,这会产生错误,因为它无法被序列化:

System.ServiceModel.Description.DataContractSerializerOperationBehavior 合同:http://tempuri.org/:IBookService ----> System.Runtime.Serialization.InvalidDataContractException:类型 'System.Linq.Expressions.Expression1[System.Func2[Foo.Book,System.Object] ]' 不能被序列化。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果类型是集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。

我将 DataContract/DataMember 属性添加到类中,以便可以对其进行序列化,但是我不确定我需要做什么才能允许对函数参数进行序列化。

谁知道我可以做些什么来让这个函数在 WCF 服务中使用?

【问题讨论】:

  • 您可能需要序列化表示表达式的字符串,并在反序列化时将字符串解析回表达式。
  • @Matt - 你的意思是:“public IEnumerable GetBooks(string includesSerialized)”并强制调用应用程序在调用函数之前创建序列化字符串?
  • 听起来您对一种 odata 协议很感兴趣。尝试改用它
  • 你可能需要这个库:github.com/esskar/Serialize.Linq

标签: c# wcf serialization


【解决方案1】:

这可能与表达式的使用有关吗?:

Why would you use Expression<Func<T>> rather than Func<T>?

【讨论】:

    【解决方案2】:

    像数组这样的通用列表不可序列化,这就是您收到错误的原因。更改您的代码,以便您传递要返回的字段列表位于可以序列化的对象中。一旦你在一个可以序列化的对象中传递参数,你的函数应该在 web 服务中工作。

    [Data Contract] 
    public class Field
    {
       [DataMember]
       public string FieldName {get; set;}
    }
    

    然后你可以将它传递给函数

    List<Fields> fieldList = new List<Field>();
    fieldList.Add(new Field("Field1");
    fieldList.Add(new Field("Field2");
    _service.GetBooks(Expression<Func<Book, object>>[]>(fieldList));
    

    ** 不确定最后一行的语法,我没有经常使用表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多