Java Android上任意对象的序列化

Java Android上任意对象的序列化,java,android,serialization,clojure,clone,Java,Android,Serialization,Clojure,Clone,我想自动转储Clojure初始化产生的一个Var对象,即一个不实现Serializable的复杂对象,并嵌套其他几个类似的对象 我尝试了一些框架,但它们不起作用(XStream生成的XML带有一些空值),Android不支持它们(Kryo需要java.misc.Unsafe,它在Android上的实现有限;JBoss序列化也需要Android上不可用的东西……),或者不是自动的(GSon需要为泛型定义类型标记…) 效率并不重要(这只是一个实验/调试) 你知道怎么做吗?你可以使用pr str转换成

我想自动转储Clojure初始化产生的一个Var对象,即一个不实现Serializable的复杂对象,并嵌套其他几个类似的对象

我尝试了一些框架,但它们不起作用(XStream生成的XML带有一些空值),Android不支持它们(Kryo需要java.misc.Unsafe,它在Android上的实现有限;JBoss序列化也需要Android上不可用的东西……),或者不是自动的(GSon需要为泛型定义类型标记…)

效率并不重要(这只是一个实验/调试)


你知道怎么做吗?

你可以使用
pr str
转换成字符串:

user=> (pr-str [:map {:a [1 2 3]} "string"])
"[:map {:a [1 2 3]} \"string\"]"
并使用edn进行读取:

user=> (require '[clojure.edn :as edn])
user=> (edn/read-string "[:map {:a [1 2 3]} \"string\"]")
[:map {:a [1 2 3]} "string"]
或者只读取字符串:

user=> (read-string "[:map {:a [1 2 3]} \"string\"]")
[:map {:a [1 2 3]} "string"]

注意读取字符串对于从“不可信来源”读取是不安全的-

您可以使用反射和递归自己完成。您的意思是迭代所有涉及的对象并将其更改为可序列化,然后使用标准对象序列化吗?不,我的意思是您可以为任意对象实现自己的对象序列化。您只需访问每个对象及其所有属性并转换m转换为xml(或任何您想要的格式)。您在clojure初始化中尝试过edn或json吗?我尝试用生成json的GSon对其进行序列化,但结果是“无法调用接口clojure.lang.IPersistentMap的无参数构造函数”谢谢你的回答,但这不是我想要的-我想转储初始化的变量,这样我就不需要再次初始化Clojure。因此,它可能适用于任意“不实现可序列化并嵌套其他几个类似对象的复杂对象”。序列化任意复杂的对象是一个图灵完全问题。你不会找到一个通用的解决方案。使用edn和不可变/无状态对象是一个非常干净的替代方案,它需要重构代码,但重构几乎可以保证是一种改进。我提到“这只是一个实验/用于调试”:显然,我可以找到原始源代码(我只有一个字节码)并重构数百个对象的层次结构。但我正在寻找一个快速的一次性解决方案,不介意它是否脏。