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

Posted

技术标签:

【中文标题】Protobuf-net:改变 System.Type 反序列化的方式【英文标题】:Protobuf-net: Changing the way System.Type is deserialized 【发布时间】:2014-09-25 15:02:37 【问题描述】:

目前我们定义了几条消息,其中包括 System.Type 字段/属性。 protobuf-net 处理 System.Type 的内置行为在许多情况下都很好,但在我们的情况下无法使用:我们确实希望类型序列化其全名,但需要控制按名称查找。

我无法为此找到合适且可行的解决方案。一方面,excellent answer 解释了如何为 System.Type 注册代理,但不幸的是,这似乎不再起作用,因为 System.Argument 异常抛出“这种类型的数据具有内置行为,并且不能以这种方式添加到模型中:System.Type"。

另一方面,“TypeModel.DynamicTypeFormatting”事件在以下情况下似乎没有被调用:

[ProtoContract]
public class Foo  [ProtoMember] public List<Type> Types; 

目前有没有一种方法可以快速解决这个问题,而无需我们提供带有快速修复的自定义版本?

【问题讨论】:

建议:为什么不简单地序列化List&lt;string&gt; 或类似的? 虽然可能我更喜欢不需要每条消息都经过额外步骤才能再次获取类型列表的解决方案。代理解决方案不起作用是否有特定原因? 我不愿更改消息格式的另一个原因是我们已经有大量包含上述序列化消息的数据,我不想再次生成它。 k;我需要看看在这种情况下发生了什么 啊,对;那将解释它,然后;您可能希望将您的编辑添加为答案 【参考方案1】:

原来我在错误的 TypeModel 实例上注册了 DynamicTypeFormatting 事件:

var model = TypeModel.Create();
model.DynamicTypeFormatting += Callback;
var compiledModel = model.Compile();
compiledModel.Deserialize();this is a completely different instance

不起作用,因为我需要在“compiledModel”上注册回调。修复这个小错误终于让我能够自定义反序列化时执行类型查找的方式。

【讨论】:

以上是关于Protobuf-net:改变 System.Type 反序列化的方式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Protobuf-net 中动态添加 Proto 成员

protobuf-net:日期时间的编码

Protobuf-net:嵌套的 IEnumerable 对象

用于继承的 Protobuf-net .proto 文件生成

使用protobuf-net继承时如何选择字段号?

带有 Protobuf-net 的端点行为配置 WCF