From d8c93b40be3acfce14abeec0151db6ce2fde8091 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 4 Nov 2019 10:46:33 +0100 Subject: [PATCH] faster serialization for deserialized data --- lib/serialization/BinaryMiddleware.js | 8 +++++++- lib/serialization/ObjectMiddleware.js | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/serialization/BinaryMiddleware.js b/lib/serialization/BinaryMiddleware.js index 21574c30b..58a5601be 100644 --- a/lib/serialization/BinaryMiddleware.js +++ b/lib/serialization/BinaryMiddleware.js @@ -10,6 +10,8 @@ const SerializerMiddleware = require("./SerializerMiddleware"); /** @typedef {import("./types").BufferSerializableType} BufferSerializableType */ /** @typedef {import("./types").PrimitiveSerializableType} PrimitiveSerializableType */ +const SERIALIZED_INFO = Symbol("serialized info"); + /* Format: @@ -86,6 +88,8 @@ const identifyNumber = n => { */ class BinaryMiddleware extends SerializerMiddleware { _handleFunctionSerialization(fn, context) { + const serializedInfo = fn[SERIALIZED_INFO]; + if (serializedInfo) return serializedInfo; return memorize(() => { const r = fn(); if (r instanceof Promise) @@ -96,12 +100,14 @@ class BinaryMiddleware extends SerializerMiddleware { } _handleFunctionDeserialization(fn, context) { - return memorize(() => { + const result = memorize(() => { const r = fn(); if (r instanceof Promise) return r.then(data => this.deserialize(data, context)); return this.deserialize(r, context); }); + result[SERIALIZED_INFO] = fn; + return result; } /** diff --git a/lib/serialization/ObjectMiddleware.js b/lib/serialization/ObjectMiddleware.js index ef4ef45f8..a37238ffa 100644 --- a/lib/serialization/ObjectMiddleware.js +++ b/lib/serialization/ObjectMiddleware.js @@ -18,6 +18,8 @@ const SetObjectSerializer = require("./SetObjectSerializer"); /** @typedef {new (...params: any[]) => any} Constructor */ +const SERIALIZED_INFO = Symbol("serialized info"); + /* Format: @@ -224,6 +226,8 @@ class ObjectMiddleware extends SerializerMiddleware { } _handleFunctionSerialization(fn, context) { + const serializedInfo = fn[SERIALIZED_INFO]; + if (serializedInfo) return serializedInfo; return memorize(() => { const r = fn(); @@ -235,7 +239,7 @@ class ObjectMiddleware extends SerializerMiddleware { } _handleFunctionDeserialization(fn, context) { - return memorize(() => { + const result = memorize(() => { const r = fn(); if (r instanceof Promise) @@ -243,6 +247,8 @@ class ObjectMiddleware extends SerializerMiddleware { return this.deserialize(r, context)[0]; }); + result[SERIALIZED_INFO] = fn; + return result; } /**