【问题标题】:Serialization of arbitrary objects on AndroidAndroid上任意对象的序列化
【发布时间】:2013-12-12 08:30:09
【问题描述】:

我想自动转储一个由 Clojure 初始化产生的 Var 对象 - 即一个不实现 Serializable 并嵌套多个类似对象的复杂对象。

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

效率并不重要(它只是一个实验/用于调试)。

知道该怎么做吗?

【问题讨论】:

  • 您可以使用反射和递归自己完成。
  • 您的意思是遍历所有涉及的对象并更改它们以实现Serializable,然后使用标准的对象序列化吗?
  • 不,我的意思是你可以为任意对象实现你自己的对象序列化。您只需访问每个对象及其所有属性并将它们转换为 xml(或您想要的任何格式)。
  • 你在clojure初始化中试过edn还是json?
  • 我尝试使用生成 json 的 GSon 对其进行序列化 - 但结果是“无法为接口 clojure.lang.IPersistentMap 调用无参数构造函数”

标签: java android serialization clojure clone


【解决方案1】:

可以使用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"]

或者只是read-string:

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

注意 read-string 从“不受信任的来源”读取是不安全的 - http://clojuredocs.org/clojure_core/1.3.0/clojure.core/read

【讨论】:

  • 谢谢你的回答,但这不是我想要的——我想转储初始化的 Var,这样我就不需要再次重新初始化 Clojure。因此,它应该可能适用于任意“不实现 Serializable 并嵌套多个其他类似对象的复杂对象”。
  • 序列化任意复杂的对象是图灵完备的问题。你不会找到一个通用的解决方案。使用 edn 和不可变/无状态对象是一个非常干净的替代方案,它需要重构代码,但重构几乎可以保证是一种改进。
  • 我提到“这只是一个实验/用于调试”:显然,我可以找到原始源代码(我只有一个字节码)并重构数百个对象的所有层次结构。但我正在寻找一种快速的一次性解决方案,不介意它是否脏。
猜你喜欢
  • 2017-01-07
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2016-01-29
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
相关资源
最近更新 更多