如何以编程方式确定类型是不是可以通过 protobuf-net 本地序列化?
Posted
技术标签:
【中文标题】如何以编程方式确定类型是不是可以通过 protobuf-net 本地序列化?【英文标题】:How do I programmatically determine if a type is natively serializable by protobuf-net?如何以编程方式确定类型是否可以通过 protobuf-net 本地序列化? 【发布时间】:2012-08-20 14:53:47 【问题描述】:我通过反映类型来动态创建 RuntimeTypeModel。当我反思一个类型时,我会查看它的每个属性并确定标签(使用我自己的机制)并将其添加到MetaType
。我还需要确定属性的类型本身是否是嵌套消息,而不是 protobuf-net 可本地序列化的原语,以便我也可以递归处理该类型,从而将其添加到模型中并制作protobuf-net 可序列化的外部类型。
例如,假设我正在反思以下类型:
public class Foo
public int Number get; set;
public string Text get; set;
public Bar InnerMessage get; set;
public class Bar
TimeSpan Duration get; set;
我被要求序列化Foo
,并且对于每个属性的每种类型,我需要确定是否需要将其作为新的MetaType
添加到模型中。显然,int
、string
和 TimeSpan
类型不需要添加到模型中,但 Bar
需要。我将如何以编程方式做出这种区分?我是否需要对这个逻辑进行硬编码(使用switch
块或if
-else
链)?如果是这样,protobuf-net r480 原生支持哪些类型(即,将它们添加到模型中会抛出 ArgumentException
声明 “这种类型的数据具有内置行为,并且不能以这种方式添加到模型中” )?
【问题讨论】:
确定属性是 ValueType、String 还是其他还不够? @rene:很遗憾没有。ValueType
可能是需要处理的自定义结构。此外,还支持特殊类型,例如 TimeSpan
(不在 TypeCode
中)、byte[]
、Guid
、Uri
以及可能的其他类/结构。并且原生支持Nullable<>
、array/collection/list/dictionary等
我假设 Marc Gravell 会弹出这个问题,但在源代码中:code.google.com/p/protobuf-net/source/browse/trunk/protobuf-net/… 在第 288 行有一个函数可以帮助你,如果它不在内部类中......
我什至不确定GetTypeCode()
是否会帮助我,即使它是公开的。如果属性的类型是int[]
怎么办? GetTypeCode()
将返回 ProtoTypeCode.Unknown
,但它可以被 protobuf-net 本地序列化。枚举也是特殊情况。这真的很复杂。
【参考方案1】:
r583 通过扩展当前的CanSerializeContractType
增加了对此的支持;现在有一个CanSerializeBasicType
和一个总体CanSerialize
。和以前一样,这保留了对处理可空类型、列表(非嵌套)和一维数组的现有支持。
【讨论】:
以上是关于如何以编程方式确定类型是不是可以通过 protobuf-net 本地序列化?的主要内容,如果未能解决你的问题,请参考以下文章
asp.net 成员资格 - 如何以编程方式确定用户是不是在角色中
如何以编程方式确定用户是不是从 iOS 中的 Adwords 转换而来,或者是不是可以将此数据转换为用户属性?