Rather than storing result as object, why not storing lambda, which retreives it?
Change
var obj = new { Number = GetNum() };DoSomeWork();Serialize(obj);
to
var lazy = () => new { Number = GetNum() }; // lambdaDoSomeWork();Serialize(lazy()); // invoke it or not
Fiddle.Note: I make your initial code compilable and returning wrong result.