Serialización del resultado de un LINQ IEnumerable

Tengo un tipo de valor simple:

[Serializable] private struct TimerInstance { public TimerInstance(string str, long nTicks) { _name = str; _ticks = nTicks; } private readonly string _name; private readonly long _ticks; public string Name { get { return _name; } } public long Ticks { get { return _ticks; } } public override string ToString() { return string.Format("{0,20}: {1,10:N}", Name, Ticks); } } 

que como se nota es serializable. Entonces tengo una lista de estos:

 static private List _Timers = new List(); 

y un método LINQ para eliminar el 5% inferior y el 5% superior de los temporizadores de la lista:

 // Return items that should be persisted. By convention, we are eliminating the "outlier" // values which I've defined as the top and bottom 5% of timer values. private static IEnumerable ItemsToPersist() { // Eliminate top and bottom 5% of timers from the enumeration. Figure out how many items // to skip on both ends. int iFivePercentOfTimers = _Timers.Count / 20; int iNinetyPercentOfTimers = _Timers.Count - iFivePercentOfTimers * 2; return (from x in _Timers orderby x.Ticks descending select x).Skip(iFivePercentOfTimers).Take(iNinetyPercentOfTimers); } 

Luego estoy tratando de Seralizar a XML el resultado de esta enumeración, es decir, serializar solo los valores de los temporizadores en el 90% intermedio, eliminando el 5% superior e inferior:

 // Serialize the timer list as XML to a stream - for storing in an Azure Blob public static void SerializeTimersToStream(Stream s) { BinaryFormatter f = new BinaryFormatter(); f.Serialize(s, ItemsToPersist()); } 

El problema es que cuando este código se ejecuta, obtengo esto:

Se produjo una primera excepción del tipo ‘System.Runtime.Serialization.SerializationException’ en mscorlib.dll Microsoft.WindowsAzure.ServiceRuntime Critical: 1: Excepción no controlada: System.Runtime.Serialization.SerializationException: Type ‘System.Linq.Enumerable + d___3 1 [[TracePerfWorker.TraceTimer + TimerInstance, TracePerfWorker, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] ‘in Assembly’ System.Core, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 ‘no es Marcado como serializable. en System.Runtime.Serialization.FormatterServices.InternalGetSProsque.Configuración.GetSerializable.placer.Configuración.GetSerializable. Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize (Porcentaje de la embarcación), Porcentaje de la embarcación de los animales (por ejemplo, por ejemplo). , ISurrogateSelector surrogateSelector, StreamingContext context, Gracio de la fuente en el buzón de la fuente, el objeto de la fuente, el objeto, el objeto, el objeto, el objeto, el objeto, el objeto, el objeto, el objeto, el objeto, el objeto, el objeto. stem.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Stream serializationStream, Object object, Header [] headers, Boolean fCheck) en System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Stream serializationStream, Object graph) TracePerfWorker.TraceTimer.SerializeTimersToStream (Transmisión en línea) en c: \ Users \ Mike \ Documents \ Visual Studio 2010 \ Projects \ AzureTracePerfTest \ TracePerfWorkerRaz.pez.png. \ Mike \ Documents \ Visual Studio 2010 \ Projects \ AzureTracePerfTest \ TracePerfWorker \ WorkerRole.cs: línea 192 en TracePerfWorker.WorkerRole.DoWorkNoTrace () en c: \ Users \ Mike \ Documents \ Visual Studio 2010 \ Projects \ AzureTracePerfTest \ TracePfactual.es .cs: ​​línea 153 en TracePerfWorker.WorkerRole.Run () en c: \ Users \ Mike \ Documents \ Visual Studio 2010 \ Projects \ AzureTracePerfTest \ TracePerfWorker \ WorkerRole.cs: línea 77 en Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.Star tRoleInternal () en Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRole () en Microsoft.WindowsAzure.ServiceRuntime.Loader. Ejecute (Ejecución de ejecución de contextoContexto, Devolución de llamada de ContextCallback, Estado del objeto, Booleano ignoreSyncCtx) en System.Threading.ExecutionContext.Run (Ejecución de ExecutionContext, ContextCallback callback, Estado del objeto) en System.Threading.ThreadHelper.ThreadHelper.ThreadHelper

Creo que entiendo lo que esto me dice: la clase implícita que el enumerador aparentemente ha generado (‘System.Linq.Enumerable + d__3a`1 [[TracePerfWorker.TraceTimer + TimerInstance, TracePerfWorker’) no está marcado como serializable.

Pero esto parece una situación muy común, en la que tomo un tipo de valor serializable (TimerInstance), y simplemente estoy creando una consulta LINQ sobre una lista de estos valores, es decir, el enumerador simplemente está devolviendo los valores de TimerInstance. ¿Cómo puedo convencerlo? que lo que el enumerador está devolviendo es solo una lista de valores de TimerInstance, ¿cuáles son serializables?

¿Qué hay de usar ToList para obtener una lista de elementos antes de llamar a serializar? List cambiar su método para devolver una List lugar de IEnumerable

http://msdn.microsoft.com/en-us/library/bb342261.aspx