Java 编年史队列序列化一次性文件

Java 编年史队列序列化一次性文件,java,chronicle-queue,Java,Chronicle Queue,使用版本4.5.27 我正在使用这段代码向队列中写入一个Throwable,然后将其读回 public static void writeThrowableToQueue(){ final Throwable throwable; try { throw new RuntimeException("serialise"); }catch(Throwable e){ throwable = e; } try (Ch

使用版本4.5.27 我正在使用这段代码向队列中写入一个Throwable,然后将其读回

    public static void writeThrowableToQueue(){
    final Throwable throwable;
    try {
        throw new RuntimeException("serialise");
    }catch(Throwable e){
        throwable = e;
    }


    try (ChronicleQueue queue = SingleChronicleQueueBuilder.binary(file).build()) {
        final ExcerptAppender appender = queue.acquireAppender();
            appender.writeDocument(w -> {
                w.getValueOut().int64(System.currentTimeMillis());
                w.getValueOut().object(throwable);
            });
    }

    try (ChronicleQueue queue = SingleChronicleQueueBuilder.binary(file).build()) {
        final ExcerptTailer tailer = queue.createTailer();
        tailer.readDocument(w -> {
            ValueIn in = w.getValueIn();
            long time = in.int64();
            System.out.println(in.object());
        });
    }

}
写得很好,当我转储队列时,我可以看到异常

但阅读引发了这个例外:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.clear(Collections.java:1074)
at net.openhft.chronicle.wire.WireMarshaller$CollectionFieldAccess.read(WireMarshaller.java:569)
at net.openhft.chronicle.wire.WireMarshaller.readMarshallable(WireMarshaller.java:143)
at net.openhft.chronicle.wire.Wires.readMarshallable(Wires.java:253)
at net.openhft.chronicle.wire.SerializationStrategies$5.readUsing(SerializationStrategies.java:121)
at net.openhft.chronicle.wire.BinaryWire$BinaryValueIn.marshallable(BinaryWire.java:2897)
at net.openhft.chronicle.wire.ValueIn.object(ValueIn.java:482)
at net.openhft.chronicle.wire.BinaryWire$BinaryValueIn.objectWithInferredType(BinaryWire.java:3158)
at net.openhft.chronicle.wire.ValueIn.object(ValueIn.java:435)
at queue.QueuePlayGround.lambda$writeThrowableToQueue$1(QueuePlayGround.java:44)
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.readDocument(SingleChronicleQueueExcerpts.java:805)
at queue.QueuePlayGround.writeThrowableToQueue(QueuePlayGround.java:41)
at queue.QueuePlayGround.main(QueuePlayGround.java:20)
我试过使用其他对象(封送标签),效果很好


非常感谢您的帮助

Throwable有一个字段,它是一个不可修改的集合,无论这个封送员尝试了什么魔法,都是在对字段和死亡做一个不准确的假设。Throwable序列化很好,所以可能这是一个bug。不过,您不需要抛出异常来实例化它(或填充其堆栈跟踪),捕获Throwable是一个不好的主意,您应该避免。同意它应该序列化,这就是我提出这个问题的原因。欣赏您关于可丢弃文件的观点-查询中的示例只是以本地化的方式演示问题。\n这里肯定有一个bug,正在调查……一个解决方法是只使用java序列化并将生成的字节数组转储到写入中。有点笨重,但可以让你绕过破碎的自定义序列化。在上面的例子中有一个编年史解决方法。您可以对ValueIn和ValueOut()使用throwable()。当然,您的代码必须知道正在编写的对象何时是可丢弃的,但我可以接受。可丢弃的字段是一个不可修改的集合,无论这个封送员尝试的是什么魔法,都是对它可以对该字段做什么做一个不准确的假设。Throwable序列化很好,所以可能这是一个bug。不过,您不需要抛出异常来实例化它(或填充其堆栈跟踪),捕获Throwable是一个不好的主意,您应该避免。同意它应该序列化,这就是我提出这个问题的原因。欣赏您关于可丢弃文件的观点-查询中的示例只是以本地化的方式演示问题。\n这里肯定有一个bug,正在调查……一个解决方法是只使用java序列化并将生成的字节数组转储到写入中。有点笨重,但可以让你绕过破碎的自定义序列化。在上面的例子中有一个编年史解决方法。您可以对ValueIn和ValueOut()使用throwable()。当然,您的代码必须知道正在编写的对象何时是可丢弃的,但我可以接受这一点。