拿到Avro-trunk下的源码,第一个分析对象就是
avro-trunk_src\lang\java下的源码
源码结构包括avro,compiler,ipc,mapred,protobuf,thrift等等
首先切入avro中
一级类集中在JsonProperties[顶级抽象类]
Schema,Protocol【继承JsonProperties】
SchemaNormalization,以及SchemaBuilder
和Exception
从中可以分析avro核心支持所谓的Json格式Schema的原因所在
从Schema中可以看出所支持的Schema类型
public enum Type {
RECORD, ENUM, ARRAY, MAP, UNION, FIXED, STRING, BYTES,
INT, LONG, FLOAT, DOUBLE, BOOLEAN, NULL;
private String name;
private Type() { this.name = this.name().toLowerCase(); }
public String getName() { return name; }
};
而Protocol包括两类Message
针对JsonProperties内置为
Map<String,JsonNode> props = new LinkedHashMap<String,JsonNode>(1);
关注两个同步方法:
public synchronized JsonNode getJsonProp(String name) {
return props.get(name);
}
和
public synchronized void addProp(String name, JsonNode value) {}
实现读写的同步控制
在Protocol中定义的Message和TwoWayMessage如下
public class Message extends JsonProperties {
private String name;
private String doc;
private Schema request;
TwoWayMessage如下
private class TwoWayMessage extends Message {
private Schema response;
private Schema errors;
针对SchemaBuilder顾名思义为 创建对应的Schema
对应包含多种类型的Builder
还包含对应的FieldDefault系列和Completion
以及
private abstract static class Completion<R> {
protected abstract R complete(Schema schema);
}
针对FieldDefault的定义如下
private static abstract class FieldDefault<R, S extends FieldDefault<R, S>> extends Completion<S> {
private final FieldBuilder<R> field;
private Schema schema;
protected FieldDefault(FieldBuilder<R> field) {
this.field = field;
}
/** Completes this field with no default value **/
public final FieldAssembler<R> noDefault() {
return field.completeField(schema);
}
private FieldAssembler<R> usingDefault(Object defaultVal) {
return field.completeField(schema, defaultVal)