我正在使用一个采用OutputStream的第三方二进制编码器。我从Marshallable的writeMarshallable方法中检索OutputStream,类似于:
public void writeMarshallable(WireOut wire) {
OutputStream outputStream = wire.bytes().outputStream();
// third party code gets the outputStream, etc.
}
wire.bytes()。outputStream()的实现在每次调用时创建一个新的StreamingOutputStream,这是我希望避免的(多余的对象分配时)底层字节实际上没有改变)。
那就是说,我正在考虑将WeakReference存储到给定的wire.bytes()值并检查提供的值引用(即==)是否与先前提供的值相同:
private WeakReference<Bytes<?>> priorBytesRef = new WeakReference<>(null);
public void writeMarshallable(WireOut wire) {
Bytes<?> bytes = wire.bytes();
if (bytes != priorBytesRef.get()) {
priorBytesRef = new WeakReference<>(bytes);
thirdPartyEncoder = EncoderFactoryExample.from(bytes.outputStream());
}
// utilize thirdPartyEncoder, etc.
}
所以我的问题是这是否是一种合理的方法,或者如果你们Chronicle的人有更合理的方式?
谢谢!
答案 0 :(得分:0)
我建议使用ThreadLocal保存StreamingOutputStream
。
static final ThreadLocal<StreamingOutputStream> bosTL = ThreadLocal.withInitial(StreamingOutputStream::new);
public void writeMarshallable(WireOut wire) {
OutputStream out = bosTL.get().init(wire.bytes());
// utilize thirdPartyEncoder, etc.
}