You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:33:08