taoensso/nippy

Disable metadata freezing

kennyjwilli opened this issue · 3 comments

Is there a way to disable the automatic freezing of metadata? Since Clojure 1.10 is out, many objects contain datafy functions. Since functions are not serializable, Nippy will throw an exception on all of these objects that looks something like this:

clojure.lang.ExceptionInfo: Unfreezable type: class clojure.core$partial$fn__5839
{:type clojure.core$partial$fn__5839, :as-str "#object[clojure.core$partial$fn__5839 0x63a4ed1e \"clojure.core$partial$fn__5839@63a4ed1e\"]"}

As a workaround, I added this:

(extend-protocol nippy/IFreezable2
  IMeta
  (-freeze-with-meta! [x ^DataOutput data-output]
    (nippy/-freeze-without-meta! x data-output)))

Ideally there would be an option I could pass to freeze to disable this.

I'm interested in this capability as well - for a different reason.

I sought to serialize a Clojure Var (which is both Serializable and IMeta), but while nippy can successfully serialize, it fails to deserialize the bytes b/c Var is an unconventional IMeta that does not implement IObj:

The failure is easy to reproduce:

(defn my-fn [])
(nippy/thaw (nippy/freeze #'my-fn))
Execution error (ClassCastException) at taoensso.nippy/thaw-from-in! (nippy.clj:1136).
clojure.lang.Var cannot be cast to clojure.lang.IObj

For my purposes I do not need the metadata to carry with the serialization, so an option for disabling metadata freezing would be ideal for me as well. (Just to offer another use case here.)

Option for this incoming shortly. Will allow disabling metadata on individual freeze or thaw calls.