【问题标题】:Serializing dynamic type parameter Protobuf-net序列化动态类型参数 Protobuf-net
【发布时间】:2013-12-30 22:29:05
【问题描述】:

没有答案的可能重复:herehere

我正在尝试使用 protobuf-net (2.0.0.668) 序列化具有 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)

我错过了什么?

谢谢!

【问题讨论】:

标签: c# serialization protobuf-net


【解决方案1】:

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

来自the wiki

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多