Chronicle-wire如何支持模式演变?

时间:2017-11-11 14:27:04

标签: chronicle

我是Chronicle-wire的新手。在文档中,它声称支持"将字段设置为默认值(如果不可用)"在模式演变部分。

我们有一个如何运作的例子吗?

我有一个向简单的Marshallable对象添加数组字段的示例。当阅读包含旧版本对象的日志时,我们如何设置默认值(例如new String [0])而不是null?

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现,下面是一个示例:

public class TestMarshallable implements Marshallable {
    private long a;
    private int b;
    private String newField = "defaultValue";
    @Override
    public void readMarshallable(@NotNull WireIn wire) throws IORuntimeException {
        a = wire.read("a").int64();
        b = wire.read("b").int32();
        if (wire.bytes().readRemaining() > 0)
            newField = wire.read("newField").text();
    }
}

在此示例中,假定您的新字段将最后写入,因此您可以简单地检查是否还有更多要读取的内容,然后这样做。默认值是您分配给该字段的值。 更复杂但更灵活的方式:

public class TestMarshallable implements Marshallable {
    private long a = 0;
    private int b = 1;
    private String newField = "defaultValue";

    @Override
    public void readMarshallable(@NotNull WireIn wire) throws IORuntimeException {
        @NotNull StringBuilder name = new StringBuilder();
        while (!wire.isEmpty()) {
            @NotNull ValueIn in = wire.read(name);
            if (StringUtils.isEqual(name, "a"))
                a = in.int64();
            else if (StringUtils.isEqual(name, "b"))
                b = in.int32();
            else if (StringUtils.isEqual(name, "newField"))
                newField = in.text();
            else
                unexpectedField(name, in);
            wire.consumePadding();
        }
    }
}

在最后一个示例中,readMarshallable只是覆盖了它在流中可能找到的字段,而其他字段则保留了默认值(注意,这也可以用于保存一定数量的写入,如果您经常编写默认值,则可以在writeMarshallable中完全跳过它们)