gpt4 book ai didi

java - 在 Clojure 中序列化此 Java 对象的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:26 25 4
gpt4 key购买 nike

我有一个虚拟 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 () ;

} catch (异常前){}

最佳答案

如果您想在纯 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)))

Example:

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

这已经适用于大多数 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 多方法添加方法,以允许 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>

如果您有一个带有 native Java 序列化方法的 Java 对象,您可以直接使用它,而不必费心编写自己的代码来实现它。

关于java - 在 Clojure 中序列化此 Java 对象的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com