2017-03-06 10 views
2

私は、ボットフレームワーク内の2つのダイアログ間にタイプIList<Attachment>のオブジェクトを渡そうとしています。ここに私のコードは、今どのように見えるかです:Microsoft Bot Frameworkのダイアログ間でオブジェクトを渡すにはどうすればよいですか?

メインダイアログ:

[Serializable] 
public class CarouselCardsDialog : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(this.MessageReceivedAsync); 
    } 

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     //This object, 'attachments' is what I need to pass to the child dialog. 
     IList<Attachment> attachments = GetCardsAttachments(); 
     context.Call(new CarouselDialog(attachments), ResumeAfterPrompt); 
    } 

    private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result) 
    { 
     string input = await result; 
     await context.PostAsync(input); 
     context.Wait(MessageReceivedAsync); 
    } 

    private static IList<Attachment> GetCardsAttachments() 
    { 
     //Get a list of attachment 
    } 
} 

これは、子ダイアログです。私は、このオブジェクトにCarouselCardsDialogから添付ファイルのリストを渡したい:私はこのコードを実行すると

[Serializable] 
public class CarouselDialog : IDialog<string> 
{ 
    private IList<Attachment> _attachments; 

    public CarouselDialog(IList<Attachment> attachments) 
    { 
     _attachments = attachments; 
    } 

    public async Task StartAsync(IDialogContext context) 
    { 
     IMessageActivity reply = context.MakeMessage(); 
     reply.AttachmentLayout = AttachmentLayoutTypes.Carousel; 
     reply.Attachments = _attachments; 
     await context.PostAsync(reply); 
     context.Wait(MessageReceivedAsync); 
    } 

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     IMessageActivity activity = await result; 
     context.Done(activity.Text); 
    } 
} 

は、しかし、私はこのエラーを取得する:

Exception: Type 'Microsoft.Bot.Connector.Attachment' in Assembly 'Microsoft.Bot.Connector, Version=3.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.

は私が間違って何をしているのですか?これを回避する方法はありますか?

+0

エラーメッセージは添付ファイルのクラスが[Serializable]である必要があります。そうでなければ、それに依存するクラスは存在しません。 –

+0

@CSmith入力いただきありがとうございます。問題は、Attachmentクラスがフレームワークに属しているため、変更することが現実的ではないと思います。このようなものに回避策があるかどうか知っていますか? – artie

+0

独自のクラスを作成し、それをシリアライズ可能としてマークし、Attachmentクラスの興味のある値で埋めてください。 –

答えて

2

添付ファイルを作成し、このデータをコンテキストのUserDataプロパティに保存するために必要なすべてのデータに対してモデルを作成して、例外を回避することができます。

context.UserData.SetValue<MyModel>("AttachmentsModel", instanceOfModel); 

し、その後でこのモデルを取得する2番目のダイアログ私はあなたにも、このプロパティにIAttachmentオブジェクトを配置しようとすることができますが、モデルは本当に保持するために行われていないので、良いことだと思う

MyModel model; 
context.UserData.TryGetValue<MyModel>("AttachmentsModel", out model); 

大きなオブジェクト。

関連する問題