序列化动态类型参数Protobuf-net
可能没有答案的重复: 这里和这里 。
我正在尝试使用protobuf-net(2.0.0.668)序列化带有params
对象数组的类。
我的params对象[]中可以有不同的类型。
使用DataContractSerializer时,只需使用[KnownType]
即可。
据我所知,protobuf-net并非如此,我必须使用[ProtoInclude]
,以及DynamicType = true
,如下所示:
[ProtoContract, ProtoInclude(20, typeof(Int32))] //Int32 as an example public class MyParams { public MyParams(){} public MyParams( string name, params object[] parms) { this.Name = name; this.Parms = parms; } [ProtoMember(1)] public string Name { get; set; } [ProtoMember(2, DynamicType = true)] public object[] Parms { get; set; } }
奇怪的是,每当我在对象数组中传递一些字符串时它就会工作,但是如果我给它任何其他东西它会失败(在这个例子中为Int32)。
这是它抛出的例外:
Exception:Thrown: "Dynamic type is not a contract-type: Int32 (System.InvalidOperationException)
我错过了什么?
谢谢!
Dynamic type
的当前实现不支持基元。 它只支持契约类型(其他类以某种方式定义为ProtoContract
)。
来自维基 :
DynamicType – 使用类型存储其他类型信息(默认情况下,它包含AssemblyQualifiedName,尽管这可以由用户控制)。 这使得序列化弱模型成为可能,即对象用于属性成员,但是目前这仅限于契约类型(不是基元),并且不适用于具有inheritance的类型(这些限制可能会在以后删除) 。 与AsReference一样,它使用非常不同的布局格式