【问题标题】:How to Serialize Avro to a byte array using Avro c# library?如何使用 Avro c# 库将 Avro 序列化为字节数组?
【发布时间】:2016-05-01 00:25:00
【问题描述】:

我正在寻找一种将 Avro 序列化为 Avro C# 库中的字节数组的方法。有一个 Avro Java 库的链接,如 Avro 文档中的以下链接所述: https://cwiki.apache.org/confluence/display/AVRO/FAQ#FAQ-Serializingtoabytearray

从以上链接复制的代码:

ByteArrayOutputStream out = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);

DatumWriter<User> writer = new SpecificDatumWriter<User>(User.getClassSchema());

writer.write(user, encoder);
encoder.flush();
out.close();
byte[] serializedBytes = out.toByteArray();

但我还没有在 Avro c# 库中找到方法。我基本上是在寻找与上述代码等效的 c#。

【问题讨论】:

    标签: c# serialization bytearray avro


    【解决方案1】:

    您可以使用这些方法将对象转换为字节数组,反之亦然。从https://stackoverflow.com/a/18205093/6138713提取的代码

    // Convert an object to a byte array
    private byte[] ObjectToByteArray(Object obj)
    {
        if(obj == null)
            return null;
    
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, obj);
    
        return ms.ToArray();
    }
    
    // Convert a byte array to an Object
    private Object ByteArrayToObject(byte[] arrBytes)
    {
        MemoryStream memStream = new MemoryStream();
        BinaryFormatter binForm = new BinaryFormatter();
        memStream.Write(arrBytes, 0, arrBytes.Length);
        memStream.Seek(0, SeekOrigin.Begin);
        Object obj = (Object) binForm.Deserialize(memStream);
    
        return obj;
    }
    

    【讨论】:

    • 抱歉我更新了我的问题,因为我可能不清楚。我正在寻找 Avro ByteArray 序列化技术。
    • 您的 avro 对象仍被视为 c# .net 中的一种对象,因此您仍然可以使用此方法。只需传递您的对象即可将其转换为字节数组。
    【解决方案2】:

    可能如下,我使用以下代码写入 Kineses Stream

    public async Task RecordAsync(ISpecificRecord record, string partitionKey)
        {
            using (var ms = new MemoryStream())
            {
                var encoder = new BinaryEncoder(ms);
                var writer = new SpecificDefaultWriter(record.Schema);
                writer.Write(record, encoder);
                // AWS Kineses 
                var putRecordRequest = new PutRecordRequest
                {
                    StreamName = _streamName,
                    Data = ms,
                    PartitionKey = partitionKey
                };
                await _kinesis.PutRecordAsync(putRecordRequest);
            }
        }
    

    public byte[] Serialize(ISpecificRecord record) 
        {
            using (var ms = new MemoryStream())
            {
                    var encoder = new BinaryEncoder(ms);
                    var writer = new SpecificDefaultWriter(record.Schema);
                    writer.Write(record, encoder);
                    return ms.ToArray();
             }
         }
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2017-02-12
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多