我正在寻找有关如何检测运行时平台以公开 Microsoft .Net 二进制反序列化失败的源类型的见解。
使用时BinaryFormatter.Deserialize(StreamingContextStates.CrossMachine)
,其中一种类型在当前二进制文件中不存在;.Net 没有抛出错误,而是插入了 object [TypeLoadExceptionHolder]
。特别是对于集合,这不会立即引起问题。
随后,当集合被序列化以在应用层之间传输时;平台收到“序列化失败”,因为[TypeLoadExceptionHolder]
无法序列化。因此,由此产生的错误对于实际提供有关导致问题的源类型的线索是无用的。现在正在寻找(时间很糟糕),看看哪个开发人员(数百名)向百万行平台添加了一种新类型。
由于用于支持平台会话缓存的序列化流,此问题经常发生。代码被相当频繁地以增量方式部署。客户页面请求可以在部署窗口期间在新旧版本的代码库之间反弹。不小心引入新类型会导致旧版本上的页面请求爆炸。
任何关于提供运行时丰富的错误/陷阱的想法将不胜感激。
(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)