Skip to content

Instantly share code, notes, and snippets.

@microamp
Created April 4, 2016 08:42
Show Gist options
  • Save microamp/c01aae93bd45385febe16aaefc30ed90 to your computer and use it in GitHub Desktop.
Save microamp/c01aae93bd45385febe16aaefc30ed90 to your computer and use it in GitHub Desktop.
Avro serialisation/deserialisation example
package main
import (
"bytes"
"log"
"github.com/linkedin/goavro"
)
const schemaPerson = `
{
"type": "record",
"name": "person",
"doc": "Schema for storing a person info",
"fields": [
{
"doc": "Last name",
"type": "string",
"name": "lastname"
},
{
"doc": "First name",
"type": "string",
"name": "firstname"
},
{
"doc": "Gender",
"type": "string",
"name": "gender"
}
]
}
`
func serialise(lastName, firstName, gender string) ([]byte, error) {
record, err := goavro.NewRecord(goavro.RecordSchema(schemaPerson))
if err != nil {
return nil, err
}
if err = record.Set("lastname", lastName); err != nil {
return nil, err
}
if err = record.Set("firstname", firstName); err != nil {
return nil, err
}
if err = record.Set("gender", gender); err != nil {
return nil, err
}
codec, err := goavro.NewCodec(schemaPerson)
if err != nil {
return nil, err
}
bb := new(bytes.Buffer)
if err = codec.Encode(bb, record); err != nil {
return nil, err
}
return bb.Bytes(), nil
}
func deserialise(serialised []byte) (interface{}, error) {
codec, err := goavro.NewCodec(schemaPerson)
if err != nil {
return nil, err
}
bb := bytes.NewBuffer(serialised)
deserialised, err := codec.Decode(bb)
if err != nil {
return nil, err
}
return deserialised, nil
}
func main() {
lastName := "Doe"
firstName := "John"
gender := "Male"
// Serialise
serialised, err := serialise(lastName, firstName, gender)
if err != nil {
log.Fatalln(err)
}
// Deserialise
deserialised, err := deserialise(serialised)
if err != nil {
log.Fatalln(err)
}
// Print JSON
log.Println(deserialised)
// Check deserialised data
record := deserialised.(*goavro.Record)
log.Printf("Record name: %s\n", record.Name)
for i, field := range record.Fields {
log.Printf("Field #%d - %s: %s\n", i, field.Name, field.Datum)
}
}
@microamp
Copy link
Author

microamp commented Apr 4, 2016

Expected output:

{person: [lastname: Doe, firstname: John, gender: Male]}
Record name: person
Field #0 - lastname: Doe
Field #1 - firstname: John
Field #2 - gender: Male

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment