序列化动态类型参数Protobuf-net

时间:2013-12-30 22:29:06

标签: c# serialization protobuf-net

可能没有答案的重复:herehere

我正在尝试使用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)

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

Dynamic type的当前实现不支持基元。它只支持契约类型(其他类以某种方式定义为ProtoContract)。

来自the wiki

  

DynamicType - 使用类型存储其他类型信息(默认情况下,它包含AssemblyQualifiedName,尽管这可以由用户控制)。这使得序列化弱模型成为可能,即对象用于属性成员,但是目前这仅限于契约类型(不是原语),并且不适用于具有继承的类型(这些限制可能会在以后删除) 。与AsReference一样,它使用非常不同的布局格式