How do I serialise Lambdas and Event delegates when Tombstoning on the Windows Phone 7?

200 views Asked by At

I've been using the Game State Management sample which has worked so far. I've hit a snag though: when Tombstoning, the screens are serialised; the only trouble is, the MessageBoxScreen has event handlers for Accepted and Cancelled.

What's the best way to serialise these? I did a bit of research on using Expression Trees but this seemed overly complex for what I wanted to do.

How do you serialise these? Or... What alternative approach do you use to save the state of a screen that contains delegates?

2

There are 2 answers

0
Steve Dunn On BEST ANSWER

I decided against this. I instead persists game flow as a kind of 'flow chart'.

The flow chart is declared in code and has properties 'LastShape' and 'LastResultFromShape'.

In my code, I rebuild the flow chart definitions each time, something like this:

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.

The flow goes from the top down, so 'AddLine' relates to the last shape added.

After tombstoning, I just read the last shape and the last result and decide where to go in the flowchart based on that.

2
Cheezmeister On

I'd definitely steer clear of attempting to serialize anything remotely resembling a lambda, or for that matter, named methods. Remember: you're storing state, and nothing else.

Depending on how far and wide your various assignments to these delegates are, you might be able to get away with maintaining a Dictionary<String, WhateverDelagateType>, serializing the keys and looking up the callbacks after deserialization.

Another thing to consider--I'm no expert, but reading between the lines it sounds as if you're working towards tombstoning a very temporary modal dialog. Do you really want that? You might be better off bringing your user right to the high scores table, or whatever follows your dialog, on his/her return.