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

Posted

技术标签:

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

没有答案的可能重复:here 和 here。

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

我错过了什么?

谢谢!

【问题讨论】:

Deserialize unknown type with protobuf-net的可能重复 【参考方案1】:

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

来自the wiki:

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

【讨论】:

以上是关于序列化动态类型参数 Protobuf-net的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net - 列出支持的类型

如何以编程方式确定类型是不是可以通过 protobuf-net 本地序列化?

有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)

限制 protobuf-net 继承“树”

protobuf-net 中的动态 protobuf 消息

Protobuf-net 和 Unity3D 类型