2014-09-25 66 views
1

目前我们定义了几个包含System.Type字段/属性的消息。 Protobuf-net处理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; } 

有目前解决这个问题的方法不迅速在我们这边发送一个带有quickfix的定制版本?

+1

建议:你为什么不简单地序列化一个'List '或类似的? – 2014-09-25 20:37:25

+0

虽然可能我宁愿一个解决方案,不需要每个消息都要经过额外的步骤才能获得类型列表。替代品的解决方案不起作用的具体原因是什么? – Simon 2014-09-26 06:37:04

+0

为什么我不愿意改变消息格式的另一个原因是我们已经有大量的数据包含像上面这样的序列化消息,我不想再次产生它。 – Simon 2014-09-26 09:34:54

回答

0

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

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

将无法​​正常工作,因为我需要注册回调上“compiledModel”代替。解决这个小错误最终让我自定义了在反序列化时执行Type查找的方式。