.Net Binary Deserialization Failure detection / судебная экспертиза для платформы во время выполнения

Я ищу понимание о том, как оснастить платформу во время выполнения для представления исходного типа двоичного отказа десериализации .NET Microsoft.

При использовании BinaryFormatter.Deserialize(StreamingContextStates.CrossMachine) и один из типов не существует в текущих двоичных файлах; вместо того, чтобы бросить ошибку, .NET вставляет объект [TypeLoadExceptionHolder]. Особенно для наборов, это не вызывает непосредственной проблемы.

Впоследствии, когда набор сериализируется для передачи между уровнями приложений; платформа получает 'отказ сериализации' потому что [TypeLoadExceptionHolder] не может быть сериализирован. Таким образом, получающаяся ошибка бесполезна для того, чтобы на самом деле дать представления относительно исходного типа, который вызвал проблему. Теперь поиск (время сосут) идет для наблюдения, какой разработчик (сотен) добавил новый тип к платформе миллионлайн.

Эта проблема происходит с некоторой частотой из-за потока сериализации, используемого для поддержки платформы sessioncache. Код развертывается справедливо часто и возрастающим способом. Клиентские запросы страницы могут возвратиться между старыми и новыми версиями кодовой базы во время окна развертывания. Небрежное введение нового типа заставит запросы страницы на старой версии аварийно завершаться.

Любые мысли об обеспечении богатой ошибки/прерывания во время выполнения ценились бы.


(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) 
12
задан Bill the Lizard 11 May 2011 в 11:23
поделиться