2009-08-17 6 views
6

Ich habe ein Dummy-Java-Programm, das ich in Clojure schreiben möchte. Es hat eine Klasse, die Serializable implementiert und eine Funktion, die es speichert. Da ich nie solche Programme in Clojure geschrieben habe, wollte ich wissen, wie man dieses Problem richtig angehen würde, welche Clojure-Datenstrukturen und API-Aufrufe würden Sie verwenden?Was wäre der richtige Weg, um dieses Java-Objekt in Clojure zu serialisieren?

import java. io. *; 

public class Box implements Serializable 
{ 
private int width; private int height; 
public void setWidth(int w) 
    { width =w;} 
public void setHeight(int h) 
    {height = h;} 
} 

public static void main (String[] args) 
{ 
    Box myBox =new Box(); 
    myBox.setWidth(50); 
    myBox.setHeight(20) ; 

try { 
    FileoutputStream fs = new File("foo.ser"); 
    ObjectOUtputStream os = new ObjectOutputStream(fs); 
    os.writeObject(myBox); 
    os . close() ; 

} catch (Exception ex) {}}

Antwort

9

Wenn Sie es in reiner Clojure tun wollen, verwenden Sie die Clojure Leser.

(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)))

Beispiel:

user> (def box {:height 50 :width 20}) 
#'user/box 
user> (serialize box "foo.ser") 
nil 
user> (deserialize "foo.ser") 
{:height 50, :width 20} 

Das bereits für die meisten Clojure Objekte funktioniert, aber nicht für die meisten Java-Objekte.

user> (serialize (java.util.Date.) "date.ser") 
; Evaluation aborted. 
No method in multimethod 'print-dup' for dispatch value: class java.util.Date 

Aber Sie können auf die print-dup Multimethod- Methoden hinzufügen, damit Clojure readably andere Objekte zu drucken.

user> (defmethod clojure.core/print-dup java.util.Date [o w] 
     (.write w (str "#=(java.util.Date. " (.getTime o) ")"))) 
#<MultiFn [email protected]> 
user> (serialize (java.util.Date.) "date.ser") 
nil 
user> (deserialize "date.ser") 
#<Date Mon Aug 17 11:30:00 PDT 2009> 

Wenn Sie ein Java-Objekt mit einer nativen Java Serialisierung Methode haben, können Sie nur, dass verwenden und nicht die Mühe, Ihren eigenen Code zu schreiben, es zu tun.