C#Avro Schema未使用数据流进行编码

时间:2017-02-02 16:48:20

标签: c# avro

我正在使用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;
        }
    }

我不确定还有什么可以尝试的。

1 个答案:

答案 0 :(得分:2)

在深入了解实际的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;
        }
    }