IGNITE-2257: Fixed.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0009b134 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0009b134 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0009b134 Branch: refs/heads/ignite-2257 Commit: 0009b1345a5b25210bccc7acfed337a48b4e7531 Parents: e67eb6d Author: vozerov-gridgain <[email protected]> Authored: Thu Dec 24 12:37:02 2015 +0300 Committer: vozerov-gridgain <[email protected]> Committed: Thu Dec 24 12:37:02 2015 +0300 ---------------------------------------------------------------------- .../internal/binary/GridBinaryMarshaller.java | 44 ++++++++++++++------ 1 file changed, 32 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/0009b134/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 95fbc0c..93f3a40 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -240,15 +240,13 @@ public class GridBinaryMarshaller { @Nullable public <T> T unmarshal(byte[] bytes, @Nullable ClassLoader clsLdr) throws BinaryObjectException { assert bytes != null; - assert BINARY_CTX.get() == null; - - BINARY_CTX.set(ctx); + BinaryContext oldCtx = pushContext(ctx); try { return (T) BinaryUtils.unmarshal(BinaryHeapInputStream.create(bytes, 0), ctx, clsLdr); } finally { - BINARY_CTX.remove(); + popContext(oldCtx); } } @@ -259,15 +257,13 @@ public class GridBinaryMarshaller { */ @SuppressWarnings("unchecked") @Nullable public <T> T unmarshal(BinaryInputStream in) throws BinaryObjectException { - assert BINARY_CTX.get() == null; - - BINARY_CTX.set(ctx); + BinaryContext oldCtx = pushContext(ctx); try { return (T)BinaryUtils.unmarshal(in, ctx, null); } finally { - BINARY_CTX.remove(); + popContext(oldCtx); } } @@ -285,19 +281,43 @@ public class GridBinaryMarshaller { if (arr[0] == NULL) return null; - assert BINARY_CTX.get() == null; - - BINARY_CTX.set(ctx); + BinaryContext oldCtx = pushContext(ctx); try { return (T)new BinaryReaderExImpl(ctx, BinaryHeapInputStream.create(arr, 0), ldr).deserialize(); } finally { - BINARY_CTX.remove(); + popContext(oldCtx); } } /** + * Push binary context and return the old one. + * + * @param ctx Binary context. + * @return Old binary context. + */ + @Nullable private static BinaryContext pushContext(BinaryContext ctx) { + BinaryContext old = BINARY_CTX.get(); + + BINARY_CTX.set(ctx); + + return old; + } + + /** + * Pop binary context and restore the old one. + * + * @param oldCtx Old binary context. + */ + private static void popContext(@Nullable BinaryContext oldCtx) { + if (oldCtx == null) + BINARY_CTX.remove(); + else + BINARY_CTX.set(oldCtx); + } + + /** * Whether object must be deserialized anyway. I.e. it cannot be converted to BinaryObject. * * @param obj Object.
