无法反序列化类型为 DialogManager(Microsoft.Bot.Builder.Dialogs)的对象


private void LoadRootDialogAsync()
{
var rootFile = this.resourceExplorer.GetResource("Main.dialog");
this.rootDialog = DeclarativeTypeLoader.Load<AdaptiveDialog>(rootFile, this.resourceExplorer, this.sourceMap);
this.dialogManager = new DialogManager(this.rootDialog);
}
string dm = JsonConvert.SerializeObject(this.dialogManager);
DialogManager dialogManager = JsonConvert.DeserializeObject<DialogManager>(dm);

但是当我尝试反序列化它时,它正在抛出

无法创建类型为 Microsoft.Bot.Builder.Dialogs.Dialogs 的实例。类型是接口或抽象类,不能实例化。

请看这个

你几乎肯定是用错误的方式解决这个问题,我将在链接的 GitHub 问题中解决这个问题,但既然我们在这里,我将回答你提出的问题。

您正在序列化的 JSON 不包含足够的信息,Newtonsoft 无法知道如何反序列化它。您告诉JsonConvert将该 JSON 反序列化为DialogManager,并且它看到RootDialog属性属于抽象类型Dialog。由于它不知道属性包含哪种类型的对话框,因此无法对其进行反序列化。

为了让 Newtonsoft 正确反序列化您的DialogManager,您必须首先正确序列化它。为此,可以使用类型名处理信息对其进行序列化。

var rootDialog = new WaterfallDialog("waterfall", new List<WaterfallStep>
{
async (stepContext, cancellationToken) => await stepContext.EndDialogAsync()
});
var dm = new DialogManager(rootDialog);
var jss = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
};
var json = JsonConvert.SerializeObject(dm, Formatting.Indented, jss);
Console.WriteLine(json);
Console.WriteLine(JsonConvert.DeserializeObject<DialogManager>(json, jss));

但是,您会注意到,此示例中的序列化瀑布对话框仅包含 ID 而不是步骤,因此它仍然不会使用所需的所有信息进行序列化。这是因为 v4 SDK 中的对话框不应序列化为 JSON,因此不能依赖 JSON 来包含对话工作所需的所有信息。您可能需要找到另一种方法来执行您尝试执行的操作,方法是遵循有关如何使用自适应对话框的说明和示例。幸运的是,有一个 JSON 架构可用于表示自适应对话,因此您可能需要查看声明性对话。

相关内容

  • 没有找到相关文章

最新更新