最近在研究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" );
}
