Поддерживает ли utf8 json, используемый в elasti c v7.x, пользовательские средства форматирования? - PullRequest
0 голосов
/ 16 июня 2020

У меня интересная ситуация, когда elasti c v7 default utf8 json сумел сериализовать мой объект, но не смог правильно десериализовать его.

    public class MyClass : FlagsSet
      {
        [JsonIgnore]
        public bool IsActive
        {
          get
          {
            return this.IsSet("active");
          }
        }
    }

      public class FlagsSet : ICollection<string>, IEnumerable<string>, IEnumerable
      {
        private readonly HashSet<string> _list = new HashSet<string>((IEqualityComparer<string>) StringComparer.InvariantCultureIgnoreCase);
      ...
        public void Add(string item)
        {
          if (string.IsNullOrEmpty(item))
            return;
          this._list.Add(item);
        }
    }

Если бы я был используя json. net Я бы справился с этим, написав конвертер, но я не могу увидеть эквивалент, используя utf8 json, поскольку, похоже, форматеры, используемые сериализатором по умолчанию (DefaultHighLevelSerializer), все зарегистрированы внутри . Я прочитал несколько страниц о сериализаторах клиентов (в частности, этот .. https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/custom-serialization.html)

Короче говоря ...

  1. Возможно ли зарегистрировать пользовательский форматировщик utf8 json (т.е. аналогичный поддерживаемому конвертеру json. net)? И если да, можете ли вы указать мне пример, пожалуйста?
  2. В качестве альтернативы, если это невозможно, есть ли способ заставить десериализацию utf8 json правильно работать с приведенным выше примером?

1 Ответ

0 голосов
/ 29 июня 2020

Ответили в обсуждении elasti c (как указано Рассом выше) .. https://discuss.elastic.co/t/does-utf8json-used-in-elastic-v7-x-support-user-defined-custom-formatters/237283/4?u=forloop

Краткое изложение ответа здесь ..

Нет, это не так. Utf8 Json, используемый внутри, является вилкой Utf8 Json, и все типы являются внутренними. Он используется для сериализации запросов и ответов, а также по умолчанию для сериализации документов. Однако нет возможности зарегистрировать пользовательские программы форматирования для документов. Некоторые простые настройки доступны через атрибуты, например StringEnumAttribute для сериализации перечислений в виде строк, но ничего более сложного. Если требуется настраиваемая сериализация, я бы рекомендовал взглянуть на JsonNetSerializer и настраиваемые конвертеры для NEST 7.x и ниже.

Короче говоря, если вам нужны преимущества более быстрой сериализации utf8 json И пользовательские форматеры ... тогда вам нужно будет реализовать собственный сериализатор, используя не-эластичный c Speci c импорт библиотеки utf8 json. В качестве альтернативы, если это звучит как много работы (!) И / ИЛИ вас устраивает более медленная работа json. net (как используется в сериализаторе по умолчанию NEST v6), тогда вы можете вернуться к этому и использовать настраиваемый конвертеры.

Впрочем, если смотреть в будущее, все выглядит ярче, поскольку v8 NEST, скорее всего, получит «новый» сериализатор, который (надеюсь) будет поддерживать настраиваемые конвертеры / форматеры ..

Для NEST 8.x, мы ищем System.Text. Json для сериализации и, вероятно, предоставим для этого настраиваемые форматеры / преобразователи.

...