2009-08-17 4 views
6

Clojure'da yazmak istediğim bir kukla Java Programı var. Seri hale getirilebilen ve onu kaydeden bir işlevi uygulayan bir sınıfa sahip. Clojure'da böyle bir program yazmamış olduğum için, bu probleme nasıl yaklaşacağımı, Clojure veri yapılarının ve api çağrılarının hangisini kullanacağınızı bilmek istedim.Bu Java Nesnesini Clojure'da serileştirmenin doğru yolu ne olurdu?

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

cevap

9

saf Clojure bunu yapmak istiyorsanız, Clojure okuyucu kullanın.

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

Örnek:

Bu zaten çoğu Clojure nesneler için çalışır, ancak çoğu Java nesneler için başarısız
user> (def box {:height 50 :width 20}) 
#'user/box 
user> (serialize box "foo.ser") 
nil 
user> (deserialize "foo.ser") 
{:height 50, :width 20} 

.

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

Ama print-dup multimethod yöntemleri ekleyebilir Clojure okunabilecek şekilde diğer nesneleri yazdırmak için izin vermek.

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> 

bir yerel Java seri hale yöntemi ile bir Java nesnesi varsa, sadece şunu kullanabilir ve bunu yapmak için kendi kod yazma rahatsız olamaz.