【发布时间】: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.Expression
1[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