序列化动态类型参数 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 本地序列化?