Chas,
I am sorry for my late response.
Thank you very much for your explanation and the code.
It was extremely helpful!
I had problems related to my classpath (I need to sleep more...),
so I ended up with a modified version that can load any file,
whether it is in the classpath or not.
I paste it here just in case somebody also wants it.
Thank you very much, Chas!
Paul.
------
(defn deser-from-file*
"Returns object stored in file f. Alternative version based on Chas
Emerick's code."
[f]
(with-open [r (-> (java.io.FileInputStream. f)
(java.io.InputStreamReader. "UTF-8")
(java.io.BufferedReader.)
(java.io.PushbackReader.))]
(read r) ))
On Aug 20, 9:43 pm, Chas Emerick <[email protected]> wrote:
> load-string evaluates the contents of the string, which brings in all
> of the compilation machinery, which produces bytecode, classes, etc.
> Classfiles have a 64K size limit in typical JVM implementations.
>
> You want to use the read fn (which requires a PushbackReader), as all
> you're interested in is the data in the file -- you don't want or need
> code generation. Here's the fn I use for doing exactly this for
> resources in the classpath:
>
> (defn read-from-classpath
> "Loads the readable content from the given path within the current
> classpath using read."
> [rsrc-path]
> (with-open [r (java.io.PushbackReader.
> (java.io.InputStreamReader.
> (.getResourceAsStream java.lang.String rsrc-path)
> "UTF-8"))]
> (read r)))
>
> Cheers,
>
> - Chas
>
> On Aug 20, 2009, at 4:02 AM, Paul GT wrote:
>
>
>
> > Dear list,
>
> > I am writing some functions to serialize and deserialize clojure data
> > structures,
> > but somehow they do not work and I am stuck.
>
> > The functions are as follows:
>
> > (use 'clojure.contrib.duck-streams)
>
> > (defn ser
> > "Returns the string serialization of object o."
> > [o]
> > (binding [*print-dup* true] (pr-str o)))
>
> > (defn deser
> > "Returns the deserialization (excecutes) of string s."
> > [s]
> > (load-string s))
>
> > (defn ser-to-file
> > "Writes object o to file f."
> > [o f]
> > (spit f (ser o)))
>
> > (defn deser-from-file
> > "Returns object stored in file f."
> > [f]
> > (deser (slurp f)))
>
> > With the above definitions, I can run the code below and it executes
> > correctly:
>
> > (ser-to-file [1 2 3] "my-file.txt") ;; Ok
> > (deser-from-file "my-file.txt") ;; Ok
>
> > But if instead of a small vector like [1 2 3]
> > I use a big one (say ten thousand entries),
> > I receive an error message:
>
> > (ser-to-file (into [] (range 10000)) "my-file.txt") ;; Ok
> > (deser-from-file "my-file.txt") ;; Error!
> > java.lang.ClassFormatError: Invalid method Code length 89867 in class
> > file user$eval__672 (NO_SOURCE_FILE:80)
>
> > Actually, I first tried with a vector of one million entries,
> > but it consumed a lot of memory.
> > I started making it smaller and smaller and, on my machine,
> > when the vector has a length of 7200, it works.
> > But when it is 7300, the error comes up.
>
> > I have tried it with clojure 1.0 and the latest 1.1 alpha in github,
> > both Vista and Ubuntu.
>
> > Looks like the problem is in the deserialization,
> > because if I look at "my-file.txt" the vector is written correctly.
>
> > I do not know what I am doing wrong.
> > If anybody could shed some light, I would be really grateful.
> > I am sorry if this seems like a simple issue or the solution is
> > obvious.
>
> > Thank you very much for your patience.
>
> > Paul.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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
-~----------~----~----~----~------~----~------~--~---