我是Chronicle-wire 的新手。在文档中,它声称支持模式演变部分中的“将字段设置为默认值,如果不可用”。
我们有一个例子说明这是如何工作的吗?
我有一个将数组字段添加到简单 Marshallable 对象的示例。当读取包含旧版本对象的期刊时,我们如何为该字段设置默认值(例如 new String[0])而不是 null?
我是Chronicle-wire 的新手。在文档中,它声称支持模式演变部分中的“将字段设置为默认值,如果不可用”。
我们有一个例子说明这是如何工作的吗?
我有一个将数组字段添加到简单 Marshallable 对象的示例。当读取包含旧版本对象的期刊时,我们如何为该字段设置默认值(例如 new String[0])而不是 null?
有几种方法可以实现这一点,一个例子如下:
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 中完全跳过它们)