【问题标题】:No serializer defined for System.Version in protobuf-netprotobuf-net 中没有为 System.Version 定义序列化程序
【发布时间】: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 版本向后兼容。)

【问题讨论】:

    标签: c#-4.0 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);
        }
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2012-09-10
      • 2022-01-04
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      相关资源
      最近更新 更多