【发布时间】:2016-07-06 15:27:35
【问题描述】:
我有这个接口,来自 WCF 服务:
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))]
public interface IQuerySageService
{
[OperationContract]
CustomerLedger GetBillingContact(string crmAccountNumber);
[OperationContract]
ImportCrmInvoicesResponse ImportCrmInvoices(List<New.Xrm.Entities.Invoice> invoices);
}
而上面提到的方法就是来自这个类:
internal static class KnownTypesProvider
{
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
{
List<Type> types = new List<Type>();
types.Add(typeof(New.Xrm.Entities.InvoiceDetail));
return types;
}
}
但是当从客户端(CRM 工作流程)调用 ImportCrmInvoices(Invoice 有 InvoiceDetail 孩子)时,我收到以下错误:
尝试序列化参数时出错 http://tempuri.org/:invoices。 InnerException 消息是“类型 带有数据合同名称的“New.Xrm.Entities.InvoiceDetail” '发票详情:http://schemas.datacontract.org/2004/07/New.Xrm.Entities' 预计不会。考虑使用 DataContractResolver 或添加任何 已知类型列表中静态未知的类型 - 例如, 通过使用 KnownTypeAttribute 属性或将它们添加到 传递给 DataContractSerializer 的已知类型列表。请参见 InnerException 了解更多详情。”
我认为这个 ServiceKnownType 装饰可以达到我所读到的效果,但显然不是。
类型(Invoice、InvoiceDetail)包含在程序集中,由客户端和服务器(命名空间New.Xrm.Entities)引用
现在,保存这些类型的物理 CS 文件很大 (7MB),几乎无法编辑。所以也许我在某处缺少DataContract 装饰,但我不想进入这个文件来添加它。
还有其他方法可以实现吗?
【问题讨论】:
-
序列化/反序列化早期绑定的实体很痛苦,而且还会增加依赖性,更不用说它拥有的 1001 个不必要的成员了。尝试使用仅包含您需要的成员的 poco 来将其展平,这样会更干净、更精简。
-
@dynamicallyCRM 我想这就是它的结果......谢谢。
标签: c# .net wcf serialization dynamics-crm-2011