【问题标题】: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 本地序列化。枚举也是特殊情况。这真的很复杂。

标签: c# .net protobuf-net


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多