From db71943a5bf3bf958d27776a0f170832002a967e Mon Sep 17 00:00:00 2001 From: Peter Taoussanis Date: Sat, 25 Jul 2020 10:15:27 +0200 Subject: [PATCH] [#122] Option to disable freezing and/or thawing of metadata --- src/taoensso/nippy.clj | 16 +++++++++----- test/taoensso/nippy/tests/main.clj | 35 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/taoensso/nippy.clj b/src/taoensso/nippy.clj index 14bd3d1..dfaf3ac 100644 --- a/src/taoensso/nippy.clj +++ b/src/taoensso/nippy.clj @@ -35,7 +35,6 @@ ;;;; TODO ;; - Performance would benefit from ^:static support / direct linking / etc. -;; - Ability to compile out metadata support? ;; - Auto cache keywords? When map keys? Configurable? Per-map ;; (`cache-keys`)? Just rely on compression? @@ -281,6 +280,8 @@ nil => default" nil) +(enc/defonce ^:dynamic *incl-metadata?* "Include metadata when freezing/thawing?" true) + (def default-serializable-whitelist "PRs welcome to add additional known-safe classes to default." #{"[I" "[F" "[Z" "[B" "[C" "[D" "[S" "[J" @@ -475,7 +476,7 @@ (extend-protocol IFreezable2 ; Must be a separate protocol clojure.lang.IMeta (-freeze-with-meta! [x ^DataOutput data-output] - (let [m (.meta x)] + (let [m (when *incl-metadata?* (.meta x))] (when m (write-id data-output id-meta) (-freeze-without-meta! m data-output))) @@ -1168,7 +1169,8 @@ (opt->bindings :freeze-fallback #'*freeze-fallback*) (opt->bindings :auto-freeze-compressor #'*auto-freeze-compressor*) (opt->bindings :serializable-whitelist #'*serializable-whitelist*) - (opt->bindings :custom-readers #'*custom-readers*))] + (opt->bindings :custom-readers #'*custom-readers*) + (opt->bindings :incl-metadata? #'*incl-metadata?*))] (if-not bindings (f) ; Common case @@ -1204,7 +1206,7 @@ types, extend the Clojure reader or see `extend-freeze`." ([x] (freeze x nil)) ([x {:as opts - :keys [compressor encryptor password serializable-whitelist] + :keys [compressor encryptor password serializable-whitelist incl-metadata?] :or {compressor :auto encryptor aes128-gcm-encryptor}}] @@ -1472,7 +1474,9 @@ id-false false id-char (.readChar in) id-meta (let [m (thaw-from-in! in)] - (with-meta (thaw-from-in! in) m)) + (if *incl-metadata?* + (with-meta (thaw-from-in! in) m) + (do (thaw-from-in! in)))) id-cached-0 (thaw-cached 0 in) id-cached-1 (thaw-cached 1 in) @@ -1656,7 +1660,7 @@ ([^bytes ba {:as opts :keys [v1-compatibility? compressor encryptor password - serializable-whitelist] + serializable-whitelist incl-metadata?] :or {compressor :auto encryptor :auto}}] diff --git a/test/taoensso/nippy/tests/main.clj b/test/taoensso/nippy/tests/main.clj index b917a9d..8d396aa 100644 --- a/test/taoensso/nippy/tests/main.clj +++ b/test/taoensso/nippy/tests/main.clj @@ -296,6 +296,41 @@ (is (= nippy/*serializable-whitelist* #{"base.1" "base.2" "add.1" "add.2"}) "JVM properties override initial serializable-whitelist value")) + +;;;; Metadata + +(deftest _metadata + + (is + (:has-meta? + (meta + (nippy/thaw + (nippy/freeze (with-meta [] {:has-meta? true}) {:incl-metadata? true}) + {:incl-metadata? true} + ))) + + "Metadata successfully included") + + (is + (nil? + (meta + (nippy/thaw + (nippy/freeze (with-meta [] {:has-meta? true}) {:incl-metadata? true}) + {:incl-metadata? false} + ))) + + "Metadata successfully excluded by thaw") + + (is + (nil? + (meta + (nippy/thaw + (nippy/freeze (with-meta [] {:has-meta? true}) {:incl-metadata? false}) + {:incl-metadata? true} + ))) + + "Metadata successfully excluded by freeze")) + ;;;; Benchmarks (deftest _benchmarks