我正在使用c#的官方avro库,并试图整理一些概念证明来说明如何将genericord从一个模式迁移到另一个模式。
在我的示例中,假设我们有3个模式:a、b和c。b与a向后兼容,c与b向后兼容,但c与a向后兼容。如果我的术语有误,基本上,a可以迁移到b,b到c,但不能直接迁移到c。
我想做的是编写一个小方法,将a迁移到b,然后将b迁移到c,并返回结果,但是,我担心我的方法有点慢,可能需要一些关于如何“正确”执行此操作的建议。
这是我的基本类,它接受一个avro.schema数组,并在9秒内对一个小记录执行大约100万次转换(我知道这不科学,我只是希望得到一些基本的优化):
public class SchemaAdapter
{
private readonly Tuple<Schema, Schema>[] migrations;
public SchemaAdapter(params Schema[] schemas)
{
migrations = new Tuple<Schema, Schema>[schemas.Length - 1];
for (int i = 0; i < schemas.Length - 1; i++)
{
migrations[i] = Tuple.Create(schemas[i], schemas[i + 1]);
}
}
public SchemaAdapter(Schema from, Schema to) :
this(new Schema[] { from, to })
{
}
public GenericRecord Adapt(GenericRecord record)
{
var result = record;
for (int i = 0; i < migrations.Length; i++)
{
var stream = new MemoryStream(result.ToByteArray());
var decoder = new BinaryDecoder(stream);
var reader = new GenericReader<GenericRecord>(migrations[i].Item1, migrations[i].Item2);
result = reader.Read(null, decoder);
}
return result;
}
}
我很想找到一种方法,不使用genericord类,只使用字节数组就可以处理这些类型的操作。我觉得那会很理想。你有没有想过我该怎么改进?
暂无答案!
目前还没有任何答案,快来回答吧!