Я использую 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();