невозможно десериализовать объект типа DialogManager (Microsoft.Bot.Builder.Dialogs) - PullRequest
0 голосов
/ 30 января 2020
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.Dialog. Тип является интерфейсом или абстрактным классом и не может быть создан.

Пожалуйста, посмотрите на это

1 Ответ

1 голос
/ 31 января 2020

Вы почти наверняка поступите неправильно, об этом я расскажу в связанной проблеме 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));

Однако вы заметите, что в этом примере диалог сериализованного водопада содержит только идентификатор, а не шаги, поэтому он по-прежнему не ' получить сериализацию со всей необходимой информацией. Это потому, что диалоги в v4 SDK не предназначены для сериализации в JSON, и поэтому вы не можете зависеть от JSON, чтобы содержать всю информацию, необходимую для работы диалога. Возможно, вам понадобится найти другой способ сделать то, что вы пытаетесь сделать, следуя инструкциям и примерам о том, как предполагается использовать адаптивные диалоги. К счастью, существует схема JSON, которую можно использовать для представления адаптивных диалогов, поэтому вы можете захотеть заглянуть в декларативные диалоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...