6

更新到最新的 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 版本向后兼容。)

4

2 回答 2

4

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

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

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

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

RuntimeTypeModel.Default.AllowParseableTypes = true;
于 2012-11-09T19:36:13.310 回答
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);
    }
}   
于 2016-09-02T20:13:59.540 回答