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

时间:2012-08-20 14:53:48

标签: c# .net protobuf-net

我通过反映类型动态创建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表明“此类型的数据具有内置行为,并且无法添加到此模型中方式“)?

1 个答案:

答案 0 :(得分:3)

r583通过扩展当前CanSerializeContractType来增加对此的支持;现在有一个CanSerializeBasicType和一个过度拱形的CanSerialize。和以前一样,这保留了对处理可空类型,列表(非嵌套)和1维数组的现有支持。