If you want to do this in pure Clojure, use the Clojure reader.
(use 'clojure.contrib.duck-streams)
(defn serialize [o filename]
(binding [* print-dup * true]
(with-out-writer filename
(prn o))))
(defn deserialize [filename]
(read-string (slurp * filename))) Example:
user> (def box {:height 50 :width 20}) #'user/box user> (serialize box "foo.ser") nil user> (deserialize "foo.ser") {:height 50, :width 20}
This works for most Clojure objects, but not for most Java objects.
user> (serialize (java.util.Date.) "date.ser") ; Evaluation aborted. No method in multimethod 'print-dup' for dispatch value: class java.util.Date
But you can add methods to print-dup multimethod to allow Clojure to print other objects readily.
user> (defmethod clojure.core/print-dup java.util.Date [ow] (.write w (str "#=(java.util.Date. " (.getTime o) ")"))) #<MultiFn clojure.lang.MultiFn@1af9e98 > user> (serialize (java.util.Date.) "date.ser") nil user> (deserialize "date.ser") #<Date Mon Aug 17 11:30:00 PDT 2009>
If you have a Java object with your own Java serialization method, you can simply use it and not write your own code for this.
Brian carper
source share