如何以编程方式确定类型是不是可以通过 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 添加到模型中。显然,intstringTimeSpan 类型不需要添加到模型中,但 Bar 需要。我将如何以编程方式做出这种区分?我是否需要对这个逻辑进行硬编码(使用switch 块或if-else 链)?如果是这样,protobuf-net r480 原生支持哪些类型(即,将它们添加到模型中会抛出 ArgumentException 声明 “这种类型的数据具有内置行为,并且不能以这种方式添加到模型中” )?

【问题讨论】:

确定属性是 ValueType、String 还是其他还不够? @rene:很遗憾没有。 ValueType 可能是需要处理的自定义结构。此外,还支持特殊类型,例如 TimeSpan(不在 TypeCode 中)、byte[]GuidUri 以及可能的其他类/结构。并且原生支持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 转换而来,或者是不是可以将此数据转换为用户属性?

以编程方式定义DataGridView列类型

如何以编程方式确定 iPhone 的密码是不是已更改或删除?

如何以编程方式确定字体是不是为 CFF?

如何以编程方式确定 Windows 中是不是安装了 Mono 64 位以及安装在何处?