Protobuf-net 3.2.52反序列化时意外调用SetCurve3D方法引发空引用异常的排查求助
Protobuf-net 3.2.52反序列化时意外调用SetCurve3D方法引发空引用异常的排查求助
各位大佬,我最近在用protobuf-net 3.2.52做反序列化操作时碰到了一个特别诡异的问题,想请教下有没有人遇到过类似情况,或者能给点排查思路:
我有个StructCurve类,里面的SetCurve3D方法在整个解决方案里总共只被显式引用了15次,我把这15处的断点都打上了,但反序列化过程中这个方法居然被调用了,而且完全没触发我设置的任何断点!更糟的是,调用时方法依赖的对象还没完成反序列化,处于null状态,直接抛出了空引用异常。
下面是异常的调用栈信息:
Kiwy.Core.Engine.dll!Kiwy.Core.Engine.StructCurve.SetCurve3D(Kiwy.Core._3D.WrapCurve3D curve3D) Ligne 81 C# [Fonction Lightweight] protobuf-net.dll!ProtoBuf.Internal.Serializers.InheritanceCompiledSerializer<System.__Canon, System.__Canon>.ProtoBuf.Serializers.ISubTypeSerializer<System.__Canon>.ReadSubType(ref ProtoBuf.ProtoReader.State state, ProtoBuf.Serializers.SubTypeState<System.__Canon> value) Ligne 49 C# protobuf-net.Core.dll!ProtoBuf.Serializers.SubTypeState<Kiwy.Core.Engine.StructCurveBase>.ReadSubType<Kiwy.Core.Engine.StructCurve>(ref ProtoBuf.ProtoReader.State state, ProtoBuf.Serializers.ISubTypeSerializer<Kiwy.Core.Engine.StructCurve> serializer) Ligne 412 C# [Fonction Lightweight] protobuf-net.dll!ProtoBuf.Internal.Serializers.InheritanceCompiledSerializer<System.__Canon, System.__Canon>.ProtoBuf.Serializers.ISubTypeSerializer<System.__Canon>.ReadSubType(ref ProtoBuf.ProtoReader.State state, ProtoBuf.Serializers.SubTypeState<System.__Canon> value) Ligne 49 C# protobuf-net.Core.dll!ProtoBuf.ProtoReader.State.ReadBaseType<Kiwy.Core.Engine.StructCurveBase, Kiwy.Core.Engine.StructCurve>(Kiwy.Core.Engine.StructCurve value, ProtoBuf.Serializers.ISubTypeSerializer<Kiwy.Core.Engine.StructCurveBase> serializer) Ligne 1128 C# protobuf-net.dll!ProtoBuf.Internal.Serializers.InheritanceCompiledSerializer<Kiwy.Core.Engine.StructCurveBase, Kiwy.Core.Engine.StructCurve>.ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve>.Read(ref ProtoBuf.ProtoReader.State state, Kiwy.Core.Engine.StructCurve value) Ligne 20 C# protobuf-net.Core.dll!ProtoBuf.ProtoReader.State.ReadMessage<ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve>, Kiwy.Core.Engine.StructCurve>(ProtoBuf.Serializers.SerializerFeatures features, Kiwy.Core.Engine.StructCurve value, ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve> serializer) Ligne 1022 C# protobuf-net.Core.dll!ProtoBuf.ProtoReader.State.ReadRepeatedCore<ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve>, ProtoBuf.Internal.ReadBuffer<Kiwy.Core.Engine.StructCurve>, Kiwy.Core.Engine.StructCurve>(ref ProtoBuf.Internal.ReadBuffer<Kiwy.Core.Engine.StructCurve> values, ProtoBuf.Serializers.SerializerFeatures category, ProtoBuf.WireType wireType, ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve> serializer, ProtoBuf.Serializers.SerializerFeatures features) Ligne 244 C# protobuf-net.Core.dll!ProtoBuf.ProtoReader.State.FillBuffer<ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve>, Kiwy.Core.Engine.StructCurve>(ProtoBuf.Serializers.SerializerFeatures features, ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve> serializer, Kiwy.Core.Engine.StructCurve initialValue) Ligne 301 C# protobuf-net.Core.dll!ProtoBuf.Serializers.RepeatedSerializer<System.Collections.Generic.List<Kiwy.Core.Engine.StructCurve>, Kiwy.Core.Engine.StructCurve>.ReadRepeated(ref ProtoBuf.ProtoReader.State state, ProtoBuf.Serializers.SerializerFeatures features, System.Collections.Generic.List<Kiwy.Core.Engine.StructCurve> values, ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurve> serializer) Ligne 364 C# [Fonction Lightweight] protobuf-net.dll!ProtoBuf.Internal.Serializers.SimpleCompiledSerializer<System.__Canon>.ProtoBuf.Serializers.ISerializer<System.__Canon>.Read(ref ProtoBuf.ProtoReader.State state, System.__Canon value) Ligne 107 C# protobuf-net.Core.dll!ProtoBuf.ProtoReader.State.ReadMessage<ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurveMap>, Kiwy.Core.Engine.StructCurveMap>(ProtoBuf.Serializers.SerializerFeatures features, Kiwy.Core.Engine.StructCurveMap value, ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurveMap> serializer) Ligne 1022 C# protobuf-net.Core.dll!ProtoBuf.ProtoReader.State.ReadMessage<Kiwy.Core.Engine.StructCurveMap>(ProtoBuf.Serializers.SerializerFeatures features, Kiwy.Core.Engine.StructCurveMap value, ProtoBuf.Serializers.ISerializer<Kiwy.Core.Engine.StructCurveMap> serializer) Ligne 1010 C# [Fonction Lightweight] protobuf-net.dll!ProtoBuf.Internal.Serializers.SimpleCompiledSerializer<System.__Canon>.ProtoBuf.Serializers.ISerializer<System.__Canon>.Read(ref ProtoBuf.ProtoReader.State state, System.__Canon value) Ligne 107 C#
我现在完全摸不着头脑:protobuf-net是怎么绕过我设置的断点调用这个方法的?会不会是它在运行时动态生成了调用代码,导致断点没命中?有没有可能是我给类加的protobuf特性配置有问题,比如不小心把这个方法标记成了反序列化过程中需要调用的?
有没有大佬能给点排查方向或者解决方案?万分感谢!
内容来源于stack exchange
相关产品推荐
相关产品推荐

