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
相关产品推荐
相关产品推荐

