Hello noahr,
I have created a library for myself to do persistence in Clojure to
Berkeley DB. I generally leverage Clojure's reader support for
(de)serialization.
However, in one instance I had to implement a particular interface and
pass that class as parameter to the Berkeley API.
At first I, like you, used the proxy form, and, even though I
indicated implementation of the required interface, I also got the
error message that PersistentMap is not serializable.
After some doodling I found a solution that obviates the need to write
Java code.
Simply use the "get-xxx-class-xxx" family of forms.
For example, in my case I needed to supply a class that implements
java.util.Comparator (with concomitant serializable requirements on
the Berkeley API side). I did it roughly like so:
(in-ns 'myLib.CalendarComparator)
(clojure/refer 'clojure)
(defn- deserialize [bytes]
(let [stream (ObjectInputStream. (ByteArrayInputStream. bytes))]
(let [result (.readObject stream)]
(.close stream)
result)))
(defn compare [time1bytes time2bytes]
(let [t1 (deserialize time1bytes)
t2 (deserialize time2bytes)]
(if (.before t1 t2)
-1
(if (.after t1 t2)
1
0))))
;;; Declare class and make available as myLib.CalendarComparator
(try (clojure/gen-and-load-class 'mylib.CalendarComparator
:implements [java.util.Comparator])
(catch java.lang.LinkageError e))
=====
When loading the above code, I can now pass myLib.CalendarComparator
as class to the Berkeley API and no longer get the error that
PersistentMap is not serializable.
Joubert
On Sep 12, 12:59 pm, noahr <[EMAIL PROTECTED]> wrote:
> Well digging into it more, I've since realized the whole approach I
> was taking is misguided anyway, as serialization appears to be for
> marshaling the data of already defined classes. What I was really
> trying to do was create new classes (java or clojure), and stream them
> across the network, and have them executed on other side by a system
> that only knew the 'parent' class or interface. But I believe this
> will require custom class loading from bytes on the other side.
>
> I still suspect though there will be issues when trying to mix dynamic
> clojure-created classes with serialization, due to its data types not
> being serializable. Some of the customizations for java serialization
> might offer a way out, but uncertain..
>
> Also, I don't have clojure on both sides; unfamiliar with thrift/
> protocol buffers, will look them up.
>
> Thx --n
>
> > If you've got Clojure available on both ends, you can serialize with
> > (pr-str...) and deserialize with (read...). Only works with pure-
> > Clojure data structures, tho.
>
> > Maybe you could use Clojure to generate a native Java collection like
> > ArrayList and serialize that.
>
> > Another option is something like Thrift or Protocol Buffers.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---