【问题标题】:KryoException with missing no arg constructor缺少无 arg 构造函数的 KryoException
【发布时间】:2019-07-18 08:09:27
【问题描述】:

我一直在努力解决有关 Kryo 的问题。我有一个客户端服务器架构,并使用 Kryo 通过 JMS 发送消息。在我的一个响应类中,我有一个具有 javax.xml.datatype.Duration 类作为属性的类。因为是两个软件的界面,所以没机会改。

在错误堆栈中,它给出了这个类有问题:com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl。我不在我的代码中的任何地方使用它。我已经写了一些代码来告诉 Kryo 如何像这样序列化 javax.xml.datatype.Duration 类:

public Duration read(kryoi input, entryClass){
    return DataTypeFactory.newInstance().newDuration((String)kryo.readClassAndObject(input));
}

public void write(kryo, out, entryclass){
    kryo.writeClassAndObject(out, entryClass.toString());
}

这并不能解决问题。我想实现 com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl 类对象来为其编写 Kryo 序列化程序。但是我无法访问该课程。我该如何解决?

提前致谢

【问题讨论】:

    标签: java serialization kryo jaxp


    【解决方案1】:

    DurationSerializer 实现为:

        class DurationSerializer extends FieldSerializer<Duration> {
            @Override
            public void write (Kryo kryo, Output output, Duration object) {
                output.writeString(object.toString());
            }
    
            @Override
            public Duration read(Kryo kryo, Input input, Class<? extends Duration> type) {
                try {
                    return DatatypeFactory.newInstance().newDuration(input.readString());
                } catch (DatatypeConfigurationException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    

    然后将其注册为 Serializer 用于 JAXP 库的 Duration 实现:

    kryo.register(datatypeFactory.newDuration(1000).getClass(), new DurationSerializer());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多