首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chronicle是如何支持模式演化的?

Chronicle是如何支持模式演化的?
EN

Stack Overflow用户
提问于 2017-11-11 22:27:04
回答 1查看 85关注 0票数 1

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

我们有没有这样做的例子?

我有一个向简单的Marshallable对象添加数组字段的示例。当读取包含旧版本对象的期刊时,如何设置默认值(例如,新字符串)添加到字段而不是null?

EN

回答 1

Stack Overflow用户

发布于 2018-11-06 19:24:36

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

代码语言:javascript
复制
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();
    }
}

在本例中,假设您的新字段将最后写入,因此您可以简单地检查是否有更多要读取的字段-并执行此操作。默认值是您分配给该字段的值。更复杂,但更灵活的方式:

代码语言:javascript
复制
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中完全跳过它们)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47238957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档