LuisResult未标记为可序列化

时间:2017-10-09 08:53:08

标签: c# botframework luis

我有一个LUIS对话框,它成功检测到意图并调用指定的子对话框。

[Serializable]
[LuisModel("xxxxxxxxxxxx", "xxxxxxxxxxxxxxxx")]
public class RootDialog : LuisDialog<object>
{
    [LuisIntent("ApplyJob")]
    public async Task Search(IDialogContext context, IAwaitable<IMessageActivity> activity,LuisResult result)
    {
        await context.PostAsync("Lets apply for a job");
        context.Call(new ApplyJobDialog(result), ApplyJobComplete);

    }

    private async Task ApplyJobComplete(IDialogContext context, IAwaitable<object> result)
    {
        context.Done(await result);
    }
}

我将LuisResult传递给子对话框。 (所以,我可以在子对话框中提取一些实体。 - 未在以下代码中实现)

我的孩子Dialog看起来像这样

[Serializable]
public class ApplyJobDialog: IDialog<object>
{
    public LuisResult LuisResult { get; set; }

    internal ApplyJobDialog(LuisResult result)
    {
        LuisResult = result;
    }

    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("hello");
        context.Wait(AfterComplete);
    }

    private async Task AfterComplete(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        context.Done("");
    }
}

它显示&#34;你好&#34;到用户。然后它抛出一个异常。 (显示在模拟器中)即使不使用传递的&#34; LuisResult&#34;

Exception: Type ‘Microsoft.Bot.Builder.Luis.Models.LuisResult’ in Assembly ‘Microsoft.Bot.Builder, 
Version=3.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ is not marked as serializable.
[File of type 'text/plain']

但是,如果我没有调用&#34; AfterComplete&#34;,它不会抛出异常。

public async Task StartAsync(IDialogContext context)
{
    await context.PostAsync("hello");
    //context.Wait(AfterComplete);
    context.Done("");
}

我在这里做错了什么。如何调用ResumeAfter方法(如AfterComplete)并继续对话?

1 个答案:

答案 0 :(得分:1)

LuisResult类不可序列化,因此您无法在ApplyJobDialog中保存变量,因为对话框将尝试序列化。

您必须传递可序列化的内容或提取RootDialog中的实体。