首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ChronicleWire是否支持实体中的可选字段?

ChronicleWire是否支持实体中的可选字段?
EN

Stack Overflow用户
提问于 2021-10-20 22:44:16
回答 1查看 46关注 0票数 1

我正在用ChronicleWire做实验。如features中所述,开箱即可支持可选字段。

我刚刚创建了一个简单的自描述实体,其中有一个可选的(可空的)字段:

代码语言:javascript
复制
public class Foo extends SelfDescribingMarshallable {

  private String name;
  private Baz baz;
}

其中baz可能为空,也可能不为空,并实现/扩展可编组。

当我尝试将实体放入ChronicleMap时,我得到一个错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
    at net.openhft.chronicle.bytes.BytesMarshaller$BytesMarshallableFieldAccess.getValue(BytesMarshaller.java:211)
    at net.openhft.chronicle.bytes.BytesMarshaller$FieldAccess.write(BytesMarshaller.java:152)
    at net.openhft.chronicle.bytes.BytesMarshaller.writeMarshallable(BytesMarshaller.java:70)
    at net.openhft.chronicle.bytes.BytesUtil.writeMarshallable(BytesUtil.java:295)
    at net.openhft.chronicle.bytes.BytesMarshallable.writeMarshallable(BytesMarshallable.java:48)
    at net.openhft.chronicle.bytes.BytesMarshaller$BytesMarshallableFieldAccess.getValue(BytesMarshaller.java:211)
    at net.openhft.chronicle.bytes.BytesMarshaller$FieldAccess.write(BytesMarshaller.java:152)

当我尝试使用java optional时,我的实体更改为:

代码语言:javascript
复制
    public class Foo extends SelfDescribingMarshallable {

      private String name;
      private Optional<Baz> baz = Optional.empty();
    }

然后又引发了另一个错误:

代码语言:javascript
复制
Caused by: java.lang.IllegalArgumentException: type=class java.util.Optional is unsupported, it must either be of type Marshallable, String or AutoBoxed primitive Object
    at net.openhft.chronicle.wire.ValueOut.object(ValueOut.java:682)
    at net.openhft.chronicle.wire.ValueOut.untypedObject(ValueOut.java:795)
    at net.openhft.chronicle.wire.ValueOut.object(ValueOut.java:519)
    at net.openhft.chronicle.wire.WireMarshaller$ObjectFieldAccess.getValue(WireMarshaller.java:669)
    at net.openhft.chronicle.wire.WireMarshaller$FieldAccess.write(WireMarshaller.java:518)
    at net.openhft.chronicle.wire.WireMarshaller.writeMarshallable(WireMarshaller.java:199)
    at net.openhft.chronicle.wire.Marshallable.writeMarshallable(Marshallable.java:132)

我没有放弃,并尝试实现我自己的可选。如下所示:

代码语言:javascript
复制
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor(staticName = "empty")
public class OptionalValue<T extends Marshallable> implements Marshallable {

    @Nullable
    private T value;

    @Override
    public void readMarshallable(@NotNull WireIn wire) throws IORuntimeException {
        var val = wire.read("value");
        if (!val.isNull()) {
            val.marshallable(value);
        }
    }

    @Override
    public void writeMarshallable(@NotNull WireOut wire) {
        if (value == null) {
            wire.write("value").nu11();
        } else {
            wire.write("value").marshallable(value);
        }
    }

    boolean isEmpty() { return value == null; }

    T get() { return value; }
}

在本例中,我看到了另一个错误:

代码语言:javascript
复制
Caused by: java.lang.ClassCastException

    at net.openhft.chronicle.core.util.ObjectUtils.asCCE(ObjectUtils.java:294)
    at net.openhft.chronicle.core.util.ObjectUtils$ConversionFunction.apply(ObjectUtils.java:624)
    at net.openhft.chronicle.core.util.ObjectUtils$ConversionFunction.apply(ObjectUtils.java:592)
    at net.openhft.chronicle.core.ClassLocal.computeValue(ClassLocal.java:54)
    at java.base/java.lang.ClassValue.getFromHashMap(ClassValue.java:226)
    at java.base/java.lang.ClassValue.getFromBackup(ClassValue.java:208)
    at java.base/java.lang.ClassValue.get(ClassValue.java:114)
    at net.openhft.chronicle.core.util.ObjectUtils.convertTo0(ObjectUtils.java:257)
    ... 28 more
Caused by: java.lang.NoSuchMethodException: com.redacted.entity.OptionalValue.<init>(java.lang.String)
Caused by: java.lang.NoSuchMethodException: com.redacted.entity.OptionalValue.<init>(java.lang.String)

    at java.base/java.lang.Class.getConstructor0(Class.java:3349)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553)
    at net.openhft.chronicle.core.util.ObjectUtils$ConversionFunction.apply(ObjectUtils.java:620)

那么,有没有人知道如何正确修复或使用它?ChronicleWire 2.22ae6

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-21 09:27:27

由于SelfDescribingMarshallableBytesMarsahallable,因此Map更喜欢使用这种较低级别的序列化。但是,因为它的级别很低,所以它不支持null值。

您可以通过设置valueMarshaller来告诉构建器使用Marshallable

代码语言:javascript
复制
.valueMarshaller(new MarshallableReaderWriter<>(Foo.class))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69653831

复制
相关文章

相似问题

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