gpt4 book ai didi

ios - 用C语言将数组数据设置为Avro数组类型

转载 作者:可可西里 更新时间:2023-11-01 04:50:19 25 4
gpt4 key购买 nike

我正在用 Objective-C 编程。我正在使用 Apache Avro用于数据序列化。

我的 avro 架构是这样的:

{
"name": "School",
"type":"record",
"fields":[
{
"name":"Employees",
"type":["null", {"type": "array",
"items":{
"name":"Teacher",
"type":"record",
"fields":[
{"name":"name", "type":"string"}
{"name":"age", "type":"int"}
]
}
}
],
"default":null
}
]
}

在我的 Objective-C 代码中,我有一个 Teacher 对象数组,每个 teacher 对象都包含 nameage 的值。

我想使用 Avro 将教师数组数据写入文件,架构如上所示。我主要关心如何将数据写入上述模式中定义的 Employees 数组。

这是我的代码(我必须使用 C 风格的代码来完成,我遵循 Avro C documentation ):

// I don't show this function, it constructs the a `avro_value_t` based on the schema. No problem here.
avro_value_t school = [self constructSchoolValueForSchema];

// get "Employees" field
avro_value_t employees;
avro_value_get_by_name(school, "employees", &employees, 0);

int idx = 0;
for (Teacher *teacher in teacherArray) {
// get name and age
NSString *name = teacher.name;
int age = teacher.age;

// set value to avro data type.
// here 'unionField' is the field of 'Employees', it is a Avro union type which is either null or an array as defined in schema above
avro_value_t field, unionField;
avro_value_set_branch(&employees, 1, &unionField);
// based on documentation, I should use 'avro_value_append'
avro_value_append(&employees, name, idx);
// I get confused here!!!!
// in above line of code, I append 'name' to 'employees',
//which looks not correct,
// because the 'Employees' array is an array of 'Teacher', not arrary of 'name'
// What is the correct way to add teacher to 'employees' ?

idx ++;
}

我想问的问题其实在上面的代码注释里。

我正在关注 Avro C 文档,但我迷路了如何将每个 teacher 添加到 employees ?在我上面的代码中,我只将每个老师的 name 添加到 employees 数组。

最佳答案

我认为你的代码有两处错误,但我不熟悉 Avro,所以我不能保证其中之一。我只是快速浏览了您链接的文档,这是我对 avro_value_append 的理解:

创建一个新元素,即 Teacher 并通过第二个参数中的引用返回(因此它按引用返回)。我的猜测是您随后需要使用其他 avro... 方法来填充该元素(即设置教师姓名等)。最后,这样做:

avro_value_t teacher;
size_t idx;
avro_value_append(&employees, &teacher, &idx); // note that idx is also returned by reference and now contains the new elements index

我不确定你是否正确设置了员工,顺便说一句,我没有时间去研究它。

第二个问题会在您使用 name 时出现。我假设 Avro 需要 C 字符串,但您在这里使用的是 NSString。您必须对其使用 getCString:maxLength:encoding: 方法来填充准备好的缓冲区,以创建可以在 Avro 中传递的 C 字符串。您可能还可以使用 UTF8String,但请阅读其文档:您可能必须复制内存(memcpy 恶作剧),否则您的 Avro 容器将获取其数据远离它的脚下。

关于ios - 用C语言将数组数据设置为Avro数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38639352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com