2016-07-28 19 views
5

Tôi đang lập trình trong Objective-C. Tôi đang sử dụng Apache Avro để tuần tự hóa dữ liệu.đặt dữ liệu arrary thành loại mảng Avro với ngôn ngữ C

schema Avro của tôi là thế này:

{ 
"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 
    } 
] 
} 

Trong mã Objective-C của tôi, tôi có một mảng của Teacher đối tượng, mỗi đối tượng giáo viên chứa giá trị của name & age.

Tôi muốn ghi dữ liệu mảng giáo viên vào tệp bằng Avro với lược đồ hiển thị ở trên. Tôi chủ yếu quan tâm về cách ghi dữ liệu vào mảng Employees được xác định trong giản đồ trên.

Đây là mã của tôi (Tôi có sử dụng mã phong cách C để làm điều đó, tôi làm theo cá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 ++; 
} 

Các câu hỏi tôi muốn hỏi là thực sự trong các bình luận mã trên.

Tôi đang theo dõi tài liệu Avro C đó, nhưng tôi bị mất cách tôi có thể thêm mỗi teacher vào employees? Trong mã trên của tôi, tôi chỉ thêm name của mỗi giáo viên vào mảng employees.

Trả lời

1

Tôi nghĩ rằng có hai điều sai với mã của bạn, nhưng tôi không quen thuộc với Avro, vì vậy tôi không thể đảm bảo một trong số họ. Tôi chỉ nhanh chóng thò đầu vào tài liệu bạn liên kết và dưới đây là cách tôi hiểu avro_value_append:

tạo một yếu tố mới, tức là giáo viên và lợi nhuận đó thông qua các tài liệu tham khảo trong tham số thứ hai (do đó nó sẽ trả về-by-reference). Tôi đoán là sau đó bạn cần phải sử dụng các phương pháp avro... khác để điền vào phần tử đó (ví dụ: đặt tên giáo viên và vv). Cuối cùng, thực hiện điều này:

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 

Tôi không chắc chắn nếu bạn thiết lập nhân viên một cách chính xác, btw, tôi không có thời gian để nhìn vào đó.

Vấn đề thứ hai sẽ phát sinh khi bạn sử dụng name tại một số thời điểm. Tôi giả định Avro mong đợi chuỗi C, nhưng bạn đang sử dụng một NSString ở đây. Bạn sẽ phải sử dụng phương thức getCString:maxLength:encoding: trên nó để điền vào bộ đệm đã chuẩn bị để tạo chuỗi C mà bạn có thể chuyển xung quanh trong Avro. Bạn cũng có thể sử dụng UTF8String, nhưng đọc tài liệu của nó: Bạn có thể sẽ phải sao chép bộ nhớ (memcpy shenanigans), nếu không vùng chứa Avro của bạn sẽ bị xóa dữ liệu khỏi dưới chân nó.

Các vấn đề liên quan