protobuf-net-列出支持的类型

时间:2019-01-14 07:17:02

标签: c# protobuf-net

我正在开发一个自定义的ProtoBufFormatter(:MediaTypeFormatter),它能够将自己的类型即时注册到用于序列化/反序列化的RuntimeTypeModel。

为减少try {} catch {}块的需要,在将已支持的类型添加到RuntimeTypeModel之前,先过滤掉已受支持的类型将非常有用。自述文件仅提供默认情况下受支持的“模糊”列表类型,而Model.GetTypes()方法仅返回手动添加到当前模型中的类型的列表。

自述文件:https://github.com/mgravell/protobuf-net

我正在使用protobuf-net 2.4.0

所以我想知道是否有任何简单的方法来检查当前RuntimeTypeModel是否已支持类型? 目前,我正在使用类似的方法来预过滤类型:

    private bool IsSimpleType(Type type)
    {
        return
            type.IsPrimitive ||
            _additionalSimpleTypes.Contains(type) ||
            Convert.GetTypeCode(type) != TypeCode.Object ||
            (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) && IsSimpleType(type.GetGenericArguments()[0]));
    }

    private Type[] _additionalSimpleTypes = new Type[]
    {
                typeof(Enum),
                typeof(String),
                typeof(String[]),
                typeof(Decimal),
                typeof(DateTime),
                typeof(DateTimeOffset),
                typeof(TimeSpan),
                typeof(Guid),
                typeof(Uri),
                typeof(Byte),
                typeof(Byte[]),
                typeof(Char),
                typeof(Boolean),
                typeof(Object),
                typeof(Version)
    };

    private Type[] _listTypes = new Type[]
    {
        typeof(Enum),
                typeof(IEnumerable<>),
                typeof(List<>),
                typeof(IList<>)
    };

1 个答案:

答案 0 :(得分:2)

尝试:

 ProtoBuf.Meta.RuntimeTypeModel.Default.CanSerialize(Type type)