【问题标题】:C# Avro Schema not encoded with data streamC# Avro Schema 未使用数据流编码
【发布时间】:2017-02-02 16:48:20
【问题描述】:

我正在使用 Avro 序列化对象,然后将它们添加到将由客户端使用和反序列化的 Kafka 消息中。我尝试了几种不同的序列化方法,但它们似乎都没有将模式嵌入数据流中。这是我的序列化代码的最新版本。您可以看到已注释掉的使用各种可用编写器的尝试。

public static byte[] Serialize<T>(T recordObj) where T : ISpecificRecord
    {
        Log.Info("Serializing {0} object to Avro.", typeof(T));
        try
        {
            using (var ms = new MemoryStream())
            {
                var encoder = new BinaryEncoder(ms);
                //var writer = new SpecificDefaultWriter(recordObj.Schema);
                var writer = new SpecificDatumWriter<T>(recordObj.Schema);
                //writer.Write(recordObj.Schema, recordObj, encoder);
                writer.Write(recordObj, encoder);
                return ms.ToArray();
            }
        }
        catch (Exception ex)
        {
            Log.Error("Failed to Avro serialize object. {0}", ex);
            return null;
        }
    }

我不太确定还能尝试什么。

【问题讨论】:

    标签: c# avro


    【解决方案1】:

    在深入研究了实际的 Avro 代码后,我发现我需要一个 FileWriter,但由于DataFileWriter 没有公共构造函数,我不知道如何实例化它。原来 DataFileWriter 类上有一个名为 OpenWriter 的静态方法,它接受 DatumWriter 和 Stream 并返回 DataFileWriter。下面的代码现在可以在结果数据流中正确包含对象元数据。

     public static byte[] Serialize<T>(T recordObj) where T : ISpecificRecord
        {
            Log.Info("Serializing {0} object to Avro.",typeof(T));
            try
            {
                using(var ms = new MemoryStream())
                {
                    var specDatumWriter = new SpecificDatumWriter<T>(recordObj.Schema);
                    var specDataWriter = Avro.File.DataFileWriter<T>.OpenWriter(specDatumWriter, ms);
                    specDataWriter.Append(recordObj);
                    specDataWriter.Flush();
                    specDataWriter.Close();
                    return ms.ToArray();
                }
            } 
            catch(Exception ex)
            {
                Log.Error("Failed to Avro serialize object. {0}",ex);
                return null;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多