更新到最新的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版本向后兼容。)
答案 0 :(得分:3)
我怀疑这与AllowParseableTypes有关 - 即它是否寻找静态Parse方法作为回退。如果我记得,这不能在默认模型上启用,但我想我会在下一次部署中删除该限制。但就目前而言:
var model = TypeModel.Create();
model.AllowParseableTypes = true;
然后存储模型(并重用它),并使用model.Serialize / model.Deserialize。
如果我更改此默认模型限制,则只需:
RuntimeTypeModel.Default.AllowParseableTypes = true;
答案 1 :(得分:1)
我建议改用版本的代理,因为启用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);
}
}