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