Sto cercando informazioni su come strumentare una piattaforma runtime per esporre il tipo di origine di un errore di deserializzazione binaria Microsoft .Net.. Deserializzazione binaria netta Rilevazione guasti/analisi forense per piattaforma runtime
Quando si utilizza BinaryFormatter.Deserialize(StreamingContextStates.CrossMachine)
e uno dei tipi non esiste nei file binari correnti; invece di generare un errore, .Net inserisce l'oggetto [TypeLoadExceptionHolder]
. In particolare per le collezioni, questo non causa alcun problema immediato.
Successivamente quando la raccolta viene serializzata per la trasmissione tra i livelli dell'applicazione; la piattaforma riceve un 'errore di serializzazione' perché [TypeLoadExceptionHolder]
non può essere serializzato. Quindi l'errore risultante è inutile per fornire effettivamente indizi sul tipo di origine che ha causato il problema. Ora la caccia (time suck) è attiva per vedere quale sviluppatore (di centinaia) ha aggiunto un nuovo tipo a una piattaforma di milioni di righe.
Questo problema si verifica con una certa frequenza a causa del flusso di serializzazione utilizzato per supportare la piattaforma sessioncache. Il codice viene distribuito abbastanza spesso e in modo incrementale. Le richieste di pagine del cliente possono rimbalzare tra vecchie e nuove versioni del codebase durante la finestra di distribuzione. L'introduzione incurante di un nuovo tipo farà esplodere le richieste di pagina sulla vecchia versione.
Qualsiasi idea sull'errore/trap ricco di runtime sarebbe apprezzata.
(SerializationException)
Type 'System.Runtime.Serialization.TypeLoadExceptionHolder' in Assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.
- at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
- at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
- at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
- at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
- at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
- at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
- at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
- at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)