2017-10-09 115 views
0

我有一個LUIS對話框,它成功檢測到這個意圖並調用指定的子對話框。LuisResult沒有標記爲可序列化

[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傳遞給子對話框。 (所以,我可以在子對話框中提取一些實體 - 下面的代碼未實現)

我的孩子對話是這樣的

[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(""); 
    } 
} 

它顯示「你好」向user.But那麼它拋出異常。 (模擬器中顯示),即使沒有使用過「LuisResult」

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'] 

但是,如果我不調用「AfterComplete」,它不會拋出異常。

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

我在做什麼錯在這裏。我如何調用ResumeAfter方法(如AfterComplete)並繼續進行對話?

回答

1

LuisResult類不是可序列化的,所以你不能在ApplyJobDialog中保存一個變量,因爲對話框會嘗試序列化。

您將不得不傳遞可串行化的東西或提取RootDialog中的實體。

+0

你是對的。我提取了RootDialog中的實體,它工作。謝謝。 –

相關問題