我有List<HtmlAgilityPack.HtmlNode>
,但 protobuf-net 给我错误,它没有合同。当我没有来源时,如何为其指定合同?它实际上说它无法推断类型,但我认为这是因为我没有使用它的属性,对吧?
默认的二进制序列化程序也会抱怨,因为该类型未标记为可序列化。
编辑:错误信息是:
Type is not expected, and no contract can be inferred: HtmlAgilityPack.HtmlNode
我有List<HtmlAgilityPack.HtmlNode>
,但 protobuf-net 给我错误,它没有合同。当我没有来源时,如何为其指定合同?它实际上说它无法推断类型,但我认为这是因为我没有使用它的属性,对吧?
默认的二进制序列化程序也会抱怨,因为该类型未标记为可序列化。
编辑:错误信息是:
Type is not expected, and no contract can be inferred: HtmlAgilityPack.HtmlNode
坦率地说,在 HTML 的情况下,我只是存储...... html - 它有点预序列化!但是,要回答这个问题:
在 protobuf-net v2 中,您可以在运行时配置 TypeModel,它允许您通过属性和其他一些技巧来做所有事情(在 v2 中,如果没有指定其他内容,属性只会帮助引导模型)。而且因为您可以在运行时完成所有这些操作,所以您不需要更改类型 - 因此可以将其应用于您无法控制的模型。默认模型实例是 RuntimeTypeModel.Default,您可以向模型添加类型,并单独配置每个 MetaType(映射到 Type)。这允许您告诉它要应用哪些成员(属性/字段)、子类型、回调等。
如果这变得太复杂,您还可以指定一个“代理”,它允许您配置一个简单的 DTO,并使用标准转换运算符(显式或隐式)在复杂模型和简单 DTO 模型之间进行转换。
对于信息,默认模型的意义是:这就是Serializer.*
使用。但是,如果您使用 TypeModel 实例来执行序列化/反序列化,您可以为相同类型拥有多个不同配置的模型。
我不记得 HTML-agility-pack 的全部细节,但这些是通过 protobuf-net 可用于您的场景的主要选项。
对于BSon,您可以为任何类指定自己的序列化程序;见http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Writeacustomserializer
这是一个使用它序列化 C# 动态变量的示例。