最近在研究Arvo
簡單地說, Arvo 可以把物件序列化,以便系統之間溝通
Arvo介紹 
http://fangjian0423.github.io/2016/02/21/avro-intro/
http://blog.csdn.net/xyw_blog/article/details/8967362

Arvo 把物件序列化和反序列化的方式有兩種
1.需先取得Arvo Schema ,藉由Arvo Schema 產生資料對應的物件,在程式裡面作資料序列化和反序列化
ex:http://www.iteblog.com/archives/1008

這種的好處是程式撰寫簡單,但相反的比較沒彈性,如果格式改變則程式要作修改並重新編譯

2.Runtime 讀取Avro 檔案取得Schema 並作序列化及反序列化

好處是若檔案格式改變,因為程式是Runtime讀取Scheam作parse,所以不用修改
缺點是程式撰寫較為複雜(後來也覺得還好)

ex:http://blog.kazaff.me/2015/04/30/Avro%E7%9A%84%E4%B8%89%E7%A7%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%96%B9%E6%B3%95/

附上自行寫的代碼

 

public static void main( String[] args ) throws Exception
    {
        System.out.println( "Start to parse  Avro file..." );
        // read the events back using GenericRecord
        File file = new File( "D:/document/Avro.Sample" );
        DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>();
        DataFileReader<GenericRecord> fileReader = new DataFileReader<GenericRecord>( file , reader );
        GenericRecord record = new GenericData.Record( fileReader.getSchema() );

        // println schema
        List<Field> list = record.getSchema().getFields();
        System.out.println( record.getSchema().toString() );
        List<String> titles = new ArrayList<>();
        for ( Field f : list )
        {
            titles.add( f.name() );
        }

        while ( fileReader.hasNext() )
        {
            fileReader.next( record );

//            List<String> dataRow = new ArrayList<>();
            StringBuffer stb = new StringBuffer();
            for ( Field f : list )
            {
                Object obj = record.get( f.name() );
                if ( obj != null )
                {
//                    dataRow.add( "'" + obj.toString() );
                    stb.append( "," + obj.toString() );
                }
                else
                {
//                    dataRow.add( "" );
                    stb.append( "," );
                }

            }

            System.out.println( stb.toString() );
        }

        System.out.println( "Parse End" );

    }