【问题标题】:Unable to serialize/deserialize parameters passed to WCF method无法序列化/反序列化传递给 WCF 方法的参数
【发布时间】: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 工作流程)调用 ImportCrmInvoicesInvoiceInvoiceDetail 孩子)时,我收到以下错误:

尝试序列化参数时出错 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


【解决方案1】:

实现此目的的另一种方法是在您的子类派生的父 DataContract 类上使用 KnownTypes 属性。

KnownTypeAttribute 类允许您预先指定在反序列化过程中应包括在内的类型以供考虑。

(https://msdn.microsoft.com/en-us/library/ms730167(v=vs.110).aspx)

KnownTypes 属性可以采用类型参数,也可以提供该类中返回有效类型数组的方法的名称。

例如:

[DataContract]
[KnownTypes(typeof(InvoiceDetail)]
public class Invoice
{
    [DataMember]
    public string SomeProperty {get; set; }
}

[DataContract]
public class InvoiceDetail : Invoice
{
}

【讨论】:

  • 我在我的问题中添加了详细信息,关于这些类型的保存位置,我不想编辑文件。用工具编辑和生成是巨大且不方便的。
  • 该工具是否生成部分类?如果是这样,您可以创建一个应用已知类型属性的部分。
【解决方案2】:

我最终让 WCF 服务在 CRM 中进行自己的查找。 ImportCrmInvoices 方法接受 GUIDS 列表并自行获取有关它们的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2018-03-06
    相关资源
    最近更新 更多