【发布时间】: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 本地序列化。枚举也是特殊情况。这真的很复杂。
标签: c# .net protobuf-net