Résultat de sérialisation d'un LINQ IEnumerable

J'ai une simple valeur de type:

    [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);
        }
    }

qui, comme vous l'aurez remarque est sérialisable. Puis-je avoir une liste de ces:

static private List<TimerInstance> _Timers = new List<TimerInstance>();

et d'une méthode LINQ pour éliminer la partie inférieure de 5% et dans le top 5% des minuteries de la liste:

//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<TimerInstance> 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);
}

Ensuite, je suis en train de Seralize au format XML le résultat de cette énumération, c'est à dire sérialiser seulement les valeurs des compteurs dans le milieu 90%, en éliminant le haut et le bas de 5%:

//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());
}

Le problème est que lorsque ce code est exécuté, j'obtiens ceci:

Une exception de première chance de type
'Système.Moment de l'exécution.La sérialisation.SerializationException' s'est produite dans
mscorlib.dll
Microsoft.WindowsAzure.ServiceRuntime Critique: 1 : Exception Non Gérée:
Système.Moment de l'exécution.La sérialisation.SerializationException: Type De Système.Linq.Énumérable+d__3a`1[[TracePerfWorker.TraceTimer+TimerInstance,
TracePerfWorker, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null]]' en Assemblée de "Système".De Base, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089 " n'est pas marqué comme
serializable.
au Système.Moment de l'exécution.La sérialisation.FormatterServices.InternalGetSerializableMembers(RuntimeType
type)
au Système.Moment de l'exécution.La sérialisation.FormatterServices.GetSerializableMembers(Type
type, StreamingContext contexte)
au Système.Moment de l'exécution.La sérialisation.Des formateurs.Binaires.WriteObjectInfo.InitMemberInfo()
au Système.Moment de l'exécution.La sérialisation.Des formateurs.Binaires.WriteObjectInfo.InitSerialize(Objet
obj, ISurrogateSelector surrogateSelector, StreamingContext contexte,
SerObjectInfoInit serObjectInfoInit, IFormatterConverter convertisseur,
ObjectWriter objectWriter, SerializationBinder classeur)
au Système.Moment de l'exécution.La sérialisation.Des formateurs.Binaires.WriteObjectInfo.Serialize(Objet
obj, ISurrogateSelector surrogateSelector, StreamingContext contexte,
SerObjectInfoInit serObjectInfoInit, IFormatterConverter convertisseur,
ObjectWriter objectWriter, SerializationBinder classeur)
au Système.Moment de l'exécution.La sérialisation.Des formateurs.Binaires.ObjectWriter.Serialize(Objet
graphique, en-Tête[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
au Système.Moment de l'exécution.La sérialisation.Des formateurs.Binaires.BinaryFormatter.Serialize(Flux
serializationStream, Objet graphique, en-Tête [] - têtes, Boolean fCheck)
au Système.Moment de l'exécution.La sérialisation.Des formateurs.Binaires.BinaryFormatter.Serialize(Flux
serializationStream, le graphe d'Objet)
au TracePerfWorker.TraceTimer.SerializeTimersToStream(Flux s) dans c:\Users\Mike\Documents\Visual Studio
2010\Projects\AzureTracePerfTest\TracePerfWorker\TraceTimer.cs:ligne 88
au TracePerfWorker.WorkerRole.SerializeTimersToBlob(String strTimerGroupName) c:\Users\Mike\Documents\Visual Studio
2010\Projects\AzureTracePerfTest\TracePerfWorker\WorkerRole.cs:ligne
192
au TracePerfWorker.WorkerRole.DoWorkNoTrace() dans c:\Users\Mike\Documents\Visual Studio
2010\Projects\AzureTracePerfTest\TracePerfWorker\WorkerRole.cs:ligne
153
au TracePerfWorker.WorkerRole.Run() dans c:\Users\Mike\Documents\Visual Studio
2010\Projects\AzureTracePerfTest\TracePerfWorker\WorkerRole.cs:ligne 77
chez Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal()
chez Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRole()
chez Microsoft.WindowsAzure.ServiceRuntime.La mise en œuvre.Loader.RoleRuntimeBridge.b__1()
au Système.Le filetage.ThreadHelper.ThreadStart_Context(état de l'Objet)
au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet, Boolean
ignoreSyncCtx)
au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, l'état de l'Objet)
au Système.Le filetage.ThreadHelper.ThreadStart()

Je pense que j'obtiens ce que c'est de me dire - l'implicite de la classe que l'agent recenseur a apparemment généré ('Système.Linq.Énumérable+d__3a`1[[TracePerfWorker.TraceTimer+TimerInstance, TracePerfWorker') n'est pas marqué comme sérialisable.

Mais cela semble être un très commun de la situation, où je vais prendre un serializable type de valeur
(TimerInstance), et la simple construction d'une requête LINQ sur une liste de ces valeurs, c'est à dire l'agent recenseur est juste retourner TimerInstance valeurs - comment puis-je la convaincre que ce que l'agent recenseur est de retour est juste une liste de TimerInstance valeurs, qui sont sérialisables?

source d'informationauteur Mike Kelly