在Clojure中序列化这个Java对象的正确方法是什么?

在Clojure中序列化这个Java对象的正确方法是什么?,java,serialization,clojure,Java,Serialization,Clojure,我有一个虚拟Java程序,我想用Clojure编写。它有一个实现Serializable的类和一个保存它的函数。因为我从来没有在Clojure中编写过这样的程序,所以我想知道解决这个问题的正确方法是什么,您将使用什么样的Clojure数据结构和api调用 import java. io. *; public class Box implements Serializable { private int width; private int height; public void setWid

我有一个虚拟Java程序,我想用Clojure编写。它有一个实现Serializable的类和一个保存它的函数。因为我从来没有在Clojure中编写过这样的程序,所以我想知道解决这个问题的正确方法是什么,您将使用什么样的Clojure数据结构和api调用

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 () ;
}捕获(例外情况除外){}
}

如果您想在纯Clojure中执行此操作,请使用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))) 这已经适用于大多数Clojure对象,但对大多数Java对象无效

user> (serialize (java.util.Date.) "date.ser")
; Evaluation aborted.
No method in multimethod 'print-dup' for dispatch value: class java.util.Date
但是,您可以向
print dup
multi方法添加方法,以允许Clojure以可读的方式打印其他对象

user> (defmethod clojure.core/print-dup java.util.Date [o w]
        (.write w (str "#=(java.util.Date. " (.getTime o) ")")))
#<MultiFn clojure.lang.MultiFn@1af9e98>
user> (serialize (java.util.Date.) "date.ser")
nil
user> (deserialize "date.ser")
#<Date Mon Aug 17 11:30:00 PDT 2009>
user>(defmethod clojure.core/print-dup java.util.Date[o w]
(.write w(str“#=(java.util.Date.”(.gettimeo)”))
#
用户>(序列化(java.util.Date.“Date.ser”)
无
用户>(反序列化“date.ser”)
#
如果您有一个带有本机Java序列化方法的Java对象,您可以直接使用它,而不用费心编写自己的代码

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