protobuf-Net - список поддерживаемых типов - PullRequest
0 голосов
/ 14 января 2019

Я работаю над пользовательским ProtoBufFormatter (: MediaTypeFormatter), который способен на лету регистрировать собственные типы в RuntimeTypeModel, используемой для сериализации / десериализации.

Чтобы уменьшить необходимость использования блоков try {} catch {}, было бы здорово отфильтровать уже поддерживаемые типы перед их добавлением в RuntimeTypeModel. Readme предлагает только «расплывчатые» типы списков, которые поддерживаются по умолчанию, а метод Model.GetTypes () возвращает только список типов, которые вручную добавляются в текущую модель.

Readme: 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 голосов
/ 14 января 2019

Попробуйте:

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