Interesting, thanks for the new perspective! Using YAML seems more
flexible than what I was thinking, particularly since Clojure
apparently doesn't make me worry too much about the specific kind of
sequence/map I'm using.

(Yeah, I have an app which sends serialized objects all over the
place, and one thing I didn't like was how brittle my serialization
tool was when I made a little change to object definitions. (This is
in Common Lisp.) In my next release, I'd like to make it less strict.)


Tayssir


On Dec 2, 11:12 am, Luc Prefontaine <[EMAIL PROTECTED]>
wrote:
> I use YAML to serialize. I needed a simple way to pass Maps, Lists and
> Vector between java,  Ruby and Clojure components.
> I change the classes of Clojure in the YAML output to java.util.Map,
> List and so on to remove dependencies
> on Clojure classes while retaining the ability to walk through the
> structures using these basic types in "foreign"
> components. In Java it's pretty obvious, Map, List and Vectors are
> always present and in Ruby these things are
> also part of the core language.
>
> Have a look athttp://jyaml.sourceforge.net/
>
> Essentially it sums up to something like this:
>
> (def *YAML-config* (YamlConfig.))
> (. *YAML-config* load yamlmsg) ;; Loads a YAML representation to an
> equivalent object representation
> (. *YAML-config* dump  msg) ;; Dumps an object to a YAML string.
>
> I extended a bit the library to deal transparently with types like
> java.sql.Date (I deal with several databases)
> but nothing else was changed. Just beware of binary characters in your
> strings. I encoded these with XML/HTML escapes before serializing.
> I need to talk to the maintainer about this issue.
>
> Never liked Java serialization mainly because:
>
> a) The the binary representation of classes has to be exactly the same
> at both ends otherwise you are stuck in a dead end.
>
> b) You need that [EMAIL PROTECTED]@[EMAIL PROTECTED] Serializable interface 
> which should be
> implemented by default everywhere by Java, not you.
>     An embedded object misses the interface ? Well find it.. at run-time
> and good luck.
>
> c) It's not easy to debug since it's not human readable.
>
> d) It makes upgrading a distributed environment a pain in the ass since
> you may have upgrade everything even if no major
>     changes occurred in your classes. You added a method irrelevant to
> most of the components in a class ?
>     That single change forces you to upgrade everything... this is a
> typical example of developpers disconnected from real life.
>     In real life your systems are running and you may not be able to
> interrupt services for a long period to upgrade them
>     all at once. You may have to do so in multiple steps and without
> interrupting the service.
>
> e) I want the data serialized, not the access to it...
>
> If size of the YAML output becomes an issue then zip it.
>
> Luc
>
> On Tue, 2008-12-02 at 00:57 -0800, Tayssir John Gabbour wrote:
> > Hi!
>
> > How should I approach serialization? I made a little test function
> > which serializes and deserializes Clojure objects. It works for
> > strings, integers, symbols, LazilyPersistentVectors and.. oddly..
> > PersistentHashMaps that have exactly one element. (My Clojure is about
> > a month old.)
>
> > But for other things, like keywords and most PersistentHashMaps, it
> > throws NotSerializableException.
>
> > My imagined possible solutions:
>
> > * Implement Serializable for Clojure data -- but is it possible in a
> >   dynamic "Hey I'll just write a new method!" way?
>
> > * Go into Clojure's source and implement Serializable to the Java
> >   classes.
>
> > My end goal is using a nonrelational DB like Tokyo Cabinet or
> > BerkeleyDB.
>
> > Thanks,
> > Tayssir
>
> > PS: Here's my test code:
>
> > (defn my-identity "Copies obj through serialization and
> > deserialization."
> >   [obj]
> >   (let [byte-out (new java.io.ByteArrayOutputStream)
> >         obj-out  (new java.io.ObjectOutputStream byte-out)]
> >     (try (.writeObject obj-out obj)
> >          (finally (.close obj-out)))
> >     (let [obj-in  (new java.io.ObjectInputStream
> >                        (new java.io.ByteArrayInputStream (.toByteArray
> > byte-out)))]
> >       (try (.readObject obj-in)
> >            (finally (.close obj-in))))))
>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to