如何使用protobuf-net或其他序列化程序序列化第三方类型?

时间:2011-10-23 21:54:02

标签: c# .net serialization protobuf-net binary-serialization

我有List<HtmlAgilityPack.HtmlNode>但是protobuf-net给了我错误,它没有合同。当我没有源时,如何为它指定合同?它实际上说它无法推断出类型,但我认为这是因为我没有使用它的属性,对吗?

默认的二进制序列化程序也会抱怨,因为该类型未标记为可序列化。

编辑:错误消息是:

Type is not expected, and no contract can be inferred: HtmlAgilityPack.HtmlNode

2 个答案:

答案 0 :(得分:5)

坦率地说,就HTML而言,我只是存储... html - 它有点预先序列化了!但是,要回答这个问题:

在protobuf-net v2中,您可以在运行时配置TypeModel,它允许您通过属性和一些其他技巧完成所有操作(在v2中,如果没有指定其他内容,属性只会帮助引导模型)。并且因为您可以在运行时完成所有这些操作,所以您无需更改类型 - 因此可以将其应用于控制之外的模型。 默认模型实例是RuntimeTypeModel.Default,您可以向模型添加类型,并单独配置每个MetaType(映射到Type)。这允许您告诉它应用哪些成员(属性/字段),子类型,回调等。

如果这太复杂,您还可以指定“代理”,它允许您配置简单的DTO,并使用标准转换运算符(显式或隐式)在复杂模型和简单DTO模型之间进行更改。

有关信息,默认模型的重要性是:这是Serializer.*使用的。但是,如果使用TypeModel实例执行序列化/反序列化,则可以为相同类型配置多个不同配置的模型。

我不记得HTML-agility-pack的全部细节,但这些是通过protobuf-net为您的场景提供的主要选项。

答案 1 :(得分:1)

对于BSon,您可以为任何类指定自己的序列化程序;见http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Writeacustomserializer

这是an example使用它来序列化C#动态变量。