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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:28