2009-08-17 7 views
6

J'ai un programme Java fictif, que je veux écrire dans Clojure. Il a une classe qui implémente Serializable et une fonction qui l'enregistre. Puisque je n'ai jamais écrit de tels programmes dans Clojure, je voulais savoir quelle serait la bonne façon d'aborder ce problème, quelles structures de données Clojure et quels api utiliseriez-vous?Quelle serait la bonne façon de sérialiser cet objet Java dans Clojure?

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) {}}

Répondre

9

Si vous voulez le faire dans Clojure pur, utilisez le lecteur Clojure.

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

Exemple:

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

Cela fonctionne pour la plupart des objets Clojure déjà, mais échoue pour la plupart des objets Java.

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

Mais vous pouvez ajouter des méthodes à la print-dup multiméthode pour permettre Clojure d'imprimer d'autres objets lisiblement.

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> 

Si vous avez un objet Java avec une méthode de sérialisation Java natif, vous pouvez simplement l'utiliser et pas la peine d'écrire votre propre code pour le faire.

Questions connexes