Я использую сторонний двоичный кодер, который принимает OutputStream. Я извлекать OutputStream из метода Marshallable в writeMarshallable подобного этот:.Повторное использование Хроники Bytes 'OutputStream
public void writeMarshallable(WireOut wire) {
OutputStream outputStream = wire.bytes().outputStream();
// third party code gets the outputStream, etc.
}
wire.bytes() OutputStream() «s реализация создает новую 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.
}
Таким образом, мой вопрос заключается в том, является ли это разумным подходом, или если у вас есть хроники у людей более целесообразным способом?
спасибо !!
Если распределение в Marshallable является путем в ServiceWrapper (то есть, это распределение _single_ управляется ServiceWrapper), является ThreadLocal необходимым или я могу просто уйти с BytesOutputStream _class member_? Еще раз спасибо, Пит! –
@ A.Oswald ThreadLocal нужен только в том случае, если вы не можете быть уверены, что только один поток будет использовать поток. –
Если у меня нет ни управления версиями, ни зависимостей, я боюсь, что существует конфликт Bytes _type_, предоставляемый Chronicle-Queue (net.openhft.chronicle.bytes) против того, что требует api от BytesOutputStream (net.openhft.lang. -й). Я получал BytesOutputStream из OpenHFT/Java-Lang (v 6.8.2). –