Ошибка сериализации AVRO - Не удалось найти какой-либо подходящий известный тип для 'Newtonsoft.Json.Linq.JToken' с помощью c # - PullRequest
0 голосов
/ 31 октября 2018

Я использую nuget Microsoft.Hadoop.Avro2 для сериализации avro.

Я использую код ниже -

public byte[] ReadAsAvroWithHeader(string messageType,JObject obj)
        {
            Encoding encoding = new System.Text.UTF8Encoding();
            string header = $"{messageType},{Guid.NewGuid().ToString()}";

            byte[] headerBytes = Encoding.UTF8.GetBytes(header);
            byte[] avroBytes = ReadAsAvro(obj).ToArray();

            //Verify data
            string avHeader = encoding.GetString(headerBytes);
            string avAvro = encoding.GetString(avroBytes);

            return avroPayload;
        }

        public virtual MemoryStream ReadAsAvro<T>(T Instance)
        {
            var stream = new MemoryStream();

            using (var avroWriter = AvroContainer.CreateWriter<T>(stream, Codec.Deflate))
            {
                using (var seqWriter = new SequentialWriter<T>(avroWriter, 24))
                {
                    seqWriter.Write(Instance);
                }
            }

            return stream;
        }

Я передаю простые данные JSON в obj данные - {"id": "Demo123","count": 2}

Я получаю исключение в этой строке -

using (var avroWriter = AvroContainer.CreateWriter<T>(stream, Codec.Deflate))

Ошибка- Could not find any matching known type for 'Newtonsoft.Json.Linq.JToken'

Я проверил, как будто я создаю класс c # из этого входного json и помечаю его как DataContract, он работает как ожидалось.

Я сделал это, как показано ниже -

  [DataContract(Name = "RootObject", Namespace = "ConsoleApp4")]
    public class RootObject
    {
        [DataMember(Name = "id")]
        public string id{ get; set; }
        [DataMember(Name = "count")]
        public int count{ get; set; }

    }

и выполните метод, как показано ниже, его работы, но я не могу создать класс, так как я получаю входные данные json, и он может не иметь таких же свойств для создания класса :( -

RootObject test = JsonConvert.DeserializeObject<RootObject>(obj.ToString());
        byte[] avroBytes = ReadAsAvro(test).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...