私は、ボットフレームワーク内の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.
は私が間違って何をしているのですか?これを回避する方法はありますか?
エラーメッセージは添付ファイルのクラスが[Serializable]である必要があります。そうでなければ、それに依存するクラスは存在しません。 –
@CSmith入力いただきありがとうございます。問題は、Attachmentクラスがフレームワークに属しているため、変更することが現実的ではないと思います。このようなものに回避策があるかどうか知っていますか? – artie
独自のクラスを作成し、それをシリアライズ可能としてマークし、Attachmentクラスの興味のある値で埋めてください。 –