序列化动态类型参数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一样,它使用非常不同的布局格式