代码之家  ›  专栏  ›  技术社区  ›  Cody Pritchard

从Java对象创建Avro字符串

  •  0
  • Cody Pritchard  · 技术社区  · 7 年前

    我想将填充的类对象序列化为Avro字符串,作为发布者的消息。

    我已经使用Maven Apache Avro插件为我的类对象生成了一个Avro字符串

    Schema schema = ReflectionData.get().getSchema(MyClass.class);

    但是,如果我有一个完全填充的MyClass对象,如何用模式和填充的数据生成Avro字符串?

    我还没有找到这方面的好例子。感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Vishant Shah    7 年前

    假设我在java中有ReflectedCustomer类。

    import org.apache.avro.reflect.Nullable;
    
    public class ReflectedCustomer {
    
    private String firstName;
    private String lastName;
    @Nullable private String nickName;
    
    // needed by the reflection
    public ReflectedCustomer(){}
    
    public ReflectedCustomer(String firstName, String lastName, String nickName) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.nickName = nickName;
    }
    
    public String getFirstName() {
        return firstName;
    }
    
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    
    public String fullName(){
        return this.firstName + " " + this.lastName + " " + this.nickName;
    }
    
    public String getNickName() {
        return nickName;
    }
    
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    }
    

    下面的代码将使用上面的ReflectedCustomer并生成Avro字符串,然后将其读回。

    import org.apache.avro.Schema;
    import org.apache.avro.file.CodecFactory;
    import org.apache.avro.file.DataFileReader;
    import org.apache.avro.file.DataFileWriter;
    import org.apache.avro.io.DatumReader;
    import org.apache.avro.io.DatumWriter;
    import org.apache.avro.reflect.ReflectData;
    import org.apache.avro.reflect.ReflectDatumReader;
    import org.apache.avro.reflect.ReflectDatumWriter;
    import java.io.File;
    import java.io.IOException;
    
    public class ReflectionExamples {
    
        public static void main(String[] args) {
    
            // here we use reflection to determine the schema
            Schema schema = ReflectData.get().getSchema(ReflectedCustomer.class);
            System.out.println("schema = " + schema.toString(true));
    
    
            // create a file of ReflectedCustomers
            try {
                System.out.println("Writing customer-reflected.avro");
                File file = new File("customer-reflected.avro");
                DatumWriter<ReflectedCustomer> writer = new ReflectDatumWriter<>(ReflectedCustomer.class);
                DataFileWriter<ReflectedCustomer> out = new DataFileWriter<>(writer)
                        .setCodec(CodecFactory.deflateCodec(9))
                        .create(schema, file);
    
                out.append(new ReflectedCustomer("Bill", "Clark", "The Rocket"));
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            // read from an avro into our Reflected class
            // open a file of ReflectedCustomers
            try {
                System.out.println("Reading customer-reflected.avro");
                File file = new File("customer-reflected.avro");
                DatumReader<ReflectedCustomer> reader = new ReflectDatumReader<>(ReflectedCustomer.class);
                DataFileReader<ReflectedCustomer> in = new DataFileReader<>(file, reader);
    
                // read ReflectedCustomers from the file & print them as JSON
                for (ReflectedCustomer reflectedCustomer : in) {
                    System.out.println(reflectedCustomer.fullName());
                }
                // close the input file
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
    
        }
    }