Как я могу сериализовать Lambdas и Event делегатов, когда Tombstoning на Windows Phone 7?
Я использовал образец Game State Management, который работал до сих пор. Я наткнулся на загадку: во время Tombstoning экраны сериализуются; Единственная проблема в том, MessageBoxScreen
имеет обработчики событий для Принятых и Отмененных.
Какой лучший способ сериализовать их? Я провел небольшое исследование по использованию деревьев выражений, но это казалось слишком сложным для того, что я хотел сделать.
Как вы их сериализуете? Или... Какой альтернативный подход вы используете для сохранения состояния экрана с делегатами?
2 ответа
Я решил против этого. Я вместо этого сохраняю игровой процесс как своего рода "блок-схему".
Блок-схема объявлена в коде и имеет свойства "LastShape" и "LastResultFromShape".
В моем коде я каждый раз перестраиваю определения блок-схем, что-то вроде этого:
flowChart.AddShape( "ShowSplash" );
flowChart.AddLine( "MainMenu", ()=>lastResult=="Clicked" || lastResult=="TimedOut");
flowChart.AddShape( "MainMenu");
flowChart.AddLine( @"ShowOptions", ()=>lastResult=="OptionsClicked");
flowChar.AddLine( @"ShowSplash", ()=>lastResult==@"TimedOut");
etc.etc.
Поток идет сверху вниз, поэтому AddLine относится к последней добавленной фигуре.
После надгробия я просто читаю последнюю фигуру и последний результат и на этом основании решаю, куда идти в блок-схеме.
Я бы определенно избежал попыток сериализовать что-либо, отдаленно напоминающее лямбду, или, в этом отношении, именованные методы. Помните: вы храните состояние, и ничего больше.
В зависимости от того, насколько широки и широки ваши различные назначения для этих делегатов, вы сможете избежать необходимости поддерживать Dictionary<String, WhateverDelagateType>
сериализацию ключей и поиск обратных вызовов после десериализации.
Еще одна вещь для рассмотрения - я не эксперт, но чтение между строк звучит так, как будто вы работаете над надгробием очень временного модального диалога. Вы действительно этого хотите? Возможно, вам будет лучше, если вы вернете своего пользователя прямо в таблицу рекордов или что-либо, что следует вашему диалогу.