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

Protobuf-Net无法反序列化无无参构造函数的Record类型如何配置

异常原因

该异常是由于protobuf-net默认反序列化时需要调用类型的无参构造函数创建实例,而你使用位置语法声明的Account record,C#编译器不会为其自动生成无参构造函数,因此反序列化失败。

无特性的两种解决方法

你可以通过修改RuntimeTypeModel的配置实现需求,不需要给类型加任何特性:

方法1:显式指定使用record的主构造函数

你的Account的主构造函数参数刚好和你要序列化的三个属性完全对应,直接配置protobuf-net反序列化时调用这个带参构造函数即可:

RuntimeTypeModel
    .Default
    .Add<Account>()
    .Add(nameof(Account.Owner))
    .Add(nameof(Account.Identifier))
    .Add(nameof(Account.Balance))
    // 按构造函数参数的类型指定使用该构造函数实例化对象
    .UseConstructor(typeof(Identity), typeof(string), typeof(decimal));

注意:需要保证你Add属性的顺序和构造函数参数的声明顺序完全一致,protobuf-net会按顺序把反序列化得到的属性值传入构造函数。

方法2:跳过构造函数直接创建实例

如果你不需要执行构造函数的逻辑,可以配置protobuf-net直接分配内存创建未初始化的实例,之后再填充属性值:

RuntimeTypeModel
    .Default
    .Add<Account>()
    .Add(nameof(Account.Owner))
    .Add(nameof(Account.Identifier))
    .Add(nameof(Account.Balance))
    // 传入null作为构造函数参数,即跳过构造函数调用
    .UseConstructor(null);

注意:该方式会完全跳过所有构造函数的执行逻辑,如果你的构造函数内包含参数校验、额外字段初始化等操作,这些逻辑都不会生效,需要根据自身业务场景选择使用。


内容的提问来源于stack exchange,提问作者Matthew Layton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:27:04