全屏浏览
缩小浏览
回到页首

java基础---->序列化框架arvo的使用

  这里面我们介绍一下序列化框架arvo的使用,在kafka中使用的就是这个。

arvo的使用

需要通过插件生成Model类方式

img

生成我们的数据模型User.java

我们在resources里面定义即将要生成的User类的avsc结构。user.avsc的内容如下

{
    "namespace": "com.linux.huhx.avro",
    "type": "record",
    "name": "User",
    "fields": [
        {
            "name": "name",
            "type": "string"
        },
        {
            "name": "favorite_number",
            "type": [
                "int",
                "null"
            ]
        },
        {
            "name": "favorite_color",
            "type": [
                "string",
                "null"
            ]
        }
    ]
}

然后我们在pom.xml添加依赖与avro-maven-plugin插件

<dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>1.8.2</version>
</dependency>

<!-- add arvo plugin -->
<plugin>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-maven-plugin</artifactId>
    <version>1.8.2</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>schema</goal>
            </goals>
            <configuration>
                <sourceDirectory>${project.basedir}/src/main/resources</sourceDirectory>
                <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

运行mvn generate-sources,就可以在arvo目录下面看到生成的User类。内容如下:

imgUser


序列化我们的User类

public static void serializing() throws IOException {
    User user1 = new User();
    user1.setName("Alyssa");
    user1.setFavoriteNumber(256);

    User user2 = new User("Ben", 7, "red");

    User user3 = User.newBuilder()
            .setName("Charlie")
            .setFavoriteColor("blue")
            .setFavoriteNumber(null)
            .build();

    DatumWriter<User> userDatumWriter = new SpecificDatumWriter<>(User.class);
    DataFileWriter<User> dataFileWriter = new DataFileWriter<>(userDatumWriter);
    dataFileWriter.create(user1.getSchema(), new File("file/users.avro"));

    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.append(user3);
    dataFileWriter.close();
}

上面可以看到多种的创建User类的方式,运行上述代码会把User的有一个实例序列化到文件file/users.avro中。


反序列化我们的User类

public static void deserializing() throws IOException {
    // Deserialize Users from disk
    DatumReader<User> userDatumReader = new SpecificDatumReader<>(User.class);
    DataFileReader<User> dataFileReader = new DataFileReader<User>(new File("file/users.avro"), userDatumReader);
    User user = null;
    while (dataFileReader.hasNext()) {
        user = dataFileReader.next(user);
        System.out.println(user);
    }
}

根据我们上述生成的序列化file/users.avro文件反序列化生成的User实例,可以看到如下的输出:

{"name": "Alyssa", "favorite_number": 256, "favorite_color": null}
{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
{"name": "Charlie", "favorite_number": null, "favorite_color": "blue"}

不需要生成User类的方式

Avro中的数据始终与其相应的模式一起存储,这意味着无论我们是否提前知道模式,我们总是可以读取序列化项目。这允许我们在不生成代码的情况下执行序列化和反序列化。如果是这种方式的话,pom.xml里面的arvo插件不是必须的。

序列化User类

public static void serializing() throws IOException {
    Schema schema = new Schema.Parser().parse(WithoutUserGen.class.getResourceAsStream("/user.avsc"));
    GenericRecord user1 = new GenericData.Record(schema);
    user1.put("name", "Alyssa");
    user1.put("favorite_number", 256);
    // Leave favorite color null

    GenericRecord user2 = new GenericData.Record(schema);
    user2.put("name", "Ben");
    user2.put("favorite_number", 7);
    user2.put("favorite_color", "red");

    File file = new File("file/users2.avro");
    DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(schema);
    DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);
    dataFileWriter.create(schema, file);
    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.close();
}

这里把两个User类的实例序列化到file/users2.avro文件中


反序列化User类

public static void deserializing() throws IOException {
    Schema schema = new Schema.Parser().parse(WithoutUserGen.class.getResourceAsStream("/user.avsc"));
    File file = new File("file/users2.avro");
    DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(schema);
    DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(file, datumReader);
    GenericRecord user = null;
    while (dataFileReader.hasNext()) {
        user = dataFileReader.next(user);
        System.out.println(user);
    }
}

可以看到以下的输出

{"name": "Alyssa", "favorite_number": 256, "favorite_color": null}
{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}

posted @ 2018-10-03 10:00  huhx  阅读(1901)  评论(0编辑  收藏  举报