如何使用Avro c#库将Avro序列化为字节数组?

时间:2016-05-01 00:25:00

标签: c# serialization bytearray avro

我正在寻找一种方法将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#。

2 个答案:

答案 0 :(得分:0)

您可以使用这些方法将对象转换为字节数组或从对象转换为字节数组,反之亦然。从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;
}

答案 1 :(得分:0)

也许是这样,我用下面的代码写了一条Kineses流

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();
         }
     }