我通过反映类型动态创建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
表明“此类型的数据具有内置行为,并且无法添加到此模型中方式“)?
答案 0 :(得分:3)
r583通过扩展当前CanSerializeContractType
来增加对此的支持;现在有一个CanSerializeBasicType
和一个过度拱形的CanSerialize
。和以前一样,这保留了对处理可空类型,列表(非嵌套)和1维数组的现有支持。