protobuf-net 中没有为 System.Version 定义序列化程序

Posted

技术标签:

【中文标题】protobuf-net 中没有为 System.Version 定义序列化程序【英文标题】:No serializer defined for System.Version in protobuf-net 【发布时间】:2012-11-09 18:21:04 【问题描述】:

更新到最新的 protobuf-net (2.0.0.601) 后,我现在在尝试序列化 System.Version 类型的值时遇到异常。

[ProtoContract(SkipConstructor=true)]   
public class ServerLoginInfo

    [ProtoMember(1)]
    public Version ServerVersion  get; set; 

这曾经在 2.0.0.480 中运行良好,无需做任何特殊操作。

是否有可能让它在新版本中运行,还是我唯一的选择是回滚到旧版本?

(我还需要序列化/反序列化与旧的 protobuf-net 版本向后兼容。)

【问题讨论】:

【参考方案1】:

我怀疑这与 AllowParseableTypes 有关 - 即它是否寻找静态 Parse 方法作为后备。如果我记得,这不能在 default 模型上启用,但我想我会在下一次部署中删除该限制。但现在:

var model = TypeModel.Create();
model.AllowParseableTypes = true;

然后存储模型(并重用它),并使用model.Serialize/model.Deserialize。

如果我更改此默认模型限制,那么只需:

RuntimeTypeModel.Default.AllowParseableTypes = true;

【讨论】:

感谢您的快速回复。我现在可能会坚持使用旧版本的 protobuf-net,因为更改需要进行大量更改。 RuntimeTypeModel.Default.AllowParseableTypes = true; 在未来的版本中会更容易。附:感谢一个很棒的图书馆:) @andy 我打算今天晚些时候做一些改变——我看看能不能挤进去 好的,听起来不错。再次感谢@MarcGravell @andy.e r602 包含此更改,现在可用 好的,我会在下一个版本中试用新版本。感谢您的信息。【参考方案2】:

我建议改用 Version 的代理项,因为启用 AllowParseableTypes 选项可能会产生禁用适用于 AllowParseableTypes 的其他类型的某些配置的副作用。

更多细节在这里: https://github.com/mgravell/protobuf-net/issues/183

为此,请添加以下初始化程序:

RuntimeTypeModel.Default.Add(typeof(Version), false).SetSurrogate(typeof(VersionSurrogate));

以及以下类型:

[ProtoContract]
public class VersionSurrogate

    [ProtoMember(1)]
    public string Version  get; set; 

    public static implicit operator VersionSurrogate(Version value)
    
        return new VersionSurrogate
        
            Version = value.ToString()
        ;
    

    public static implicit operator Version(VersionSurrogate value)
    
        return System.Version.Parse(value.Version);
    
   

【讨论】:

以上是关于protobuf-net 中没有为 System.Version 定义序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 protobuf-net 序列化 System.Numerics.Quaternion

Protobuf-net:改变 System.Type 反序列化的方式

Protobuf-net & IL2CPP - System.Reflection.Emit 不受支持

我可以反序列化为 protobuf-net 中接口的只读属性吗?

有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)

Protobuf-net Error:Type is not expected, and no contract can be inferred: System.Data.DataTable