2016-07-28 68 views
5

setzen Ich bin in Objective-C programmieren. Ich verwende Apache Avro für die Datenserialisierung.arrary Daten in Avro Array-Typ mit C-Sprache

Mein avro Schema ist dies:

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

In meinem Objective-C-Code, ich habe ein Array von Teacher Objekten, jedes Lehrer-Objekt enthält Wert von name & age.

Ich möchte die Lehrer-Array-Daten in Datei mit Avro mit dem oben gezeigten Schema schreiben. Ich mache mir hauptsächlich Sorgen darüber, wie man Daten in das Employees Array schreibt, das im obigen Schema definiert ist.

Hier ist mein Code (ich habe C-Stil-Code zu verwenden, es zu tun, ich folge der 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 ++; 
} 

Die Frage, die ich stellen möchte, ist tatsächlich in dem Code Kommentar oben.

Ich folge dieser Avro C-Dokumentation, aber ich verliere, wie kann ich jede teacher zu employees hinzufügen? In meinem obigen Code fügte ich nur die name jedes Lehrers zu dem employees Array hinzu.

Antwort

1

Ich glaube, mit Ihrem Code sind zwei Dinge nicht in Ordnung, aber ich kenne Avro nicht, daher kann ich keinen davon garantieren. Ich bin schnell in der Dokumentation spähe Sie verknüpft und hier ist, wie ich avro_value_append verstanden:

Es schafft ein neues Element, das heißt Lehrer und kehrt, dass über die Referenz im zweiten Parameter (so es gibt-by-reference). Meine Vermutung ist, dass Sie dann die anderen avro... Methoden verwenden müssen, um dieses Element zu füllen (z. B. den Namen des Lehrers festlegen usw.). Am Ende tun:

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 

Ich bin nicht sicher, wenn Sie Mitarbeiter richtig eingerichtet ist, btw, ich nicht die Zeit in diesem Blick hatte. Das zweite Problem wird mit Ihrer Verwendung von name irgendwann auftreten. Ich nehme an, Avro erwartet C-Strings, aber Sie verwenden hier eine NSString. Sie müssen die Methode getCString:maxLength:encoding: verwenden, um einen vorbereiteten Puffer zu füllen, um eine C-Zeichenfolge zu erstellen, die Sie in Avro weitergeben können. Sie können wahrscheinlich auch UTF8String verwenden, aber lesen Sie die Dokumentation: Sie müssen wahrscheinlich den Speicher kopieren (memcpy shenanigans), sonst wird Ihr Avro-Container seine Daten unter seinen Füßen weggeräumt bekommen.