json.net - Azure Functions (Durable) - 类型是接口或抽象类,无法实例化
问题描述
问题 我有一个 C# Durable Azure Functions 应用程序 (v2),其中包含一个编排和活动函数。
编排调用活动如下:
propBag.CE = await context.CallActivityAsync<CEData>(nameof(GetCEByExternalIdActivity), propBag);
调用正常,Activity 函数执行,为 propBag.CE 构建内容并返回。
CE 对象包含一些其他对象,包括:
public List<IParty> Individuals { get; set; }
public List<IParty> Organisations { get; set; }
这些属性分配如下:
consPort.Individuals = await GetParties(clientRel.RelatedIndividuals, CEEntityType.Individual);
consPort.Organisations = await GetParties(clientRel.RelatedOrganisations, CEEntityType.Organisation);
它包含一个接口这一事实似乎给 Durable Functions 运行时带来了问题。当它尝试反序列化从活动函数返回的值时,我收到以下错误:
无法创建 Interfaces.Avaloq.Application.Models.CE.IParty 类型的实例。类型是接口或抽象类,不能实例化
有谁知道一个很好的解决方法?也许有一种方法可以配置函数将如何尝试反序列化 json?
解决方法 我通过更改类以包含 IParty 的具体类型的列表来解决该问题,如下所示:
public List<Individual> Individuals { get; set; }
public List<Organisation> Organisations { get; set; }
然后,我必须确保在分配给这些属性之前从 IParty 转换为具体类型,如下所示:
var myList = (await GetParties(clientRel.RelatedIndividuals, CEEntityType.Individual));
foreach (var party in myList)
{
consPort.Individuals.Add((Individual)party);
}
myList = (await GetParties(clientRel.RelatedOrganisations, CEEntityType.Organisation));
foreach (var party in myList)
{
consPort.Organisations.Add((Organisation)party);
}
不漂亮,但让我解决了这个问题。
解决方案
看起来您在 GitHub 上遇到了这个问题。除了您的解决方法之外,您还可以自定义 Durable Functions 使用的序列化程序设置以包含类型信息。还有另一个StackOverflow 帖子描述了这一点并有一个例子。
推荐阅读
- css - 通过 css-loader 和 Webpack 在 React 中使用字符串类名
- php - 使用受保护的方法注入类实例
- facebook - 使用自定义设计在网站上显示 Facebook 页面帖子
- android - 后压在 SaleForce 登录屏幕中不起作用
- oracle - ELSE IF 不能在 PL/SQL 中工作
- sas - SAS:分钟经过计算
- google-app-engine - 可以让单个实例运行 24 小时而不使用 GAE 上的免费 28 小时
- python - Kivy 视频播放器 - 视频未加载
- c++ - OPENSSL 错误:lib(6) func(101) reason(100) evp_enc.c
- azure - 如何将基于容器的应用程序的日志存储在它们的卷中,如 azure 文件?