升级protobuf-net至2.3.7后int&类型反序列化失败问题
解决protobuf-net 2.3.7中int&类型反序列化的兼容问题
这个问题是因为protobuf-net 2.x版本对可序列化/反序列化的类型做了更严格的校验,1.0版本中允许直接针对int&(byref类型)进行反序列化的行为在2.x中被修正了——byref类型本质上是值类型的引用传递标识,并非一个可独立实例化的类型,所以新版框架不再支持直接反序列化到byref类型。
解决方案:调整反序列化目标类型
你只需要把反序列化时指定的类型从typeof(int).MakeByRefType()改为typeof(int),直接获取值类型实例,再根据业务需求处理即可:
var stream = new MemoryStream(); Serializer.NonGeneric.SerializeWithLengthPrefix(stream, int.MaxValue, PrefixStyle.Base128, 1); stream.Position = 0; // 替换byref类型为基础int类型 if (Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int), out var lastItem)) { Console.WriteLine(lastItem); // 正常输出2147483647 }
如果确实需要处理byref场景
如果你的业务逻辑里必须用到byref传递(比如要把反序列化后的值传递给某个接受byref参数的方法),可以先获取反序列化后的int值,再赋值给目标变量后传递:
int targetValue = 0; var stream = new MemoryStream(); Serializer.NonGeneric.SerializeWithLengthPrefix(stream, int.MaxValue, PrefixStyle.Base128, 1); stream.Position = 0; if (Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, _ => typeof(int), out var valueObj)) { targetValue = (int)valueObj; // 这里可以把targetValue作为byref参数传递给其他方法 Console.WriteLine(targetValue); // 输出2147483647 }
为什么旧版本可以工作?
protobuf-net 1.0版本对类型的检查相对宽松,可能通过特殊逻辑处理了byref类型的反序列化,但这种做法并不符合框架设计的常规逻辑——序列化框架的核心是处理实例化的对象/值,而非引用传递的类型标识。2.x版本修正了这个行为,让类型处理更严谨。
内容的提问来源于stack exchange,提问作者idursun
相关产品推荐
相关产品推荐

