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