我已经看到Scala中的某些库可以自动(自)序列化任何自动支持成员类型的案例类,即JSON。
在Android世界中,我希望能够使用Intent和Bundle这样做。
示例,我希望生成这个样板代码:
case class Ambitos(idInc: Long, idGrupo: String, ambitos: Map[String, Seq[String]])
def serialize(b: Bundle) {
b.putString("grupo", idGrupo)
b.putLong("inc", idInc)
b.putStringArray("ambitos", ambitos.keys.toArray)
ambitos.foreach { case (a, det) ⇒
b.putStringArray(a, det.toArray)
}
}
def serialize(b: Intent) {
b.putExtra("grupo", idGrupo)
b.putExtra("inc", idInc)
b.putExtra("ambitos", ambitos.keys.toArray)
ambitos.foreach { case (a, det) ⇒
b.putExtra(a, det.toArray)
}
}
}
object Ambitos {
def apply(b: Intent): Ambitos =
Ambitos(b.getLongExtra("inc", -1), b.getStringExtra("grupo"),
b.getStringArrayExtra("ambitos").map{ a ⇒ (a, b.getStringArrayExtra(a).toSeq) }.toMap)
def apply(b: Bundle): Ambitos =
Ambitos(b.getLong("inc"), b.getString("grupo"),
b.getStringArray("ambitos").map{ a ⇒ (a, b.getStringArray(a).toSeq) }.toMap)
}
是否存在这样的图书馆,还是我必须亲自制作?
为了在活动之间传递复杂信息以及处理Activity onSaveInstanceState()
和onRestoreInstanceState()
,此工具非常棒。
答案 0 :(得分:2)
您可以使用GSON lib执行不同的操作,我假设您有一些复杂的对象,并且您希望从一个活动传递到另一个活动。
只需使用GSON
Gson gson = new Gson();
// convert java object to JSON format,
// and returned as JSON formatted string
String jsonString = gson.toJson(complexJavaObj);
然后只需使用
i.putExtra("objectKey",jsonString);
并在第二个活动中阅读
Bundle extras = getIntent().getExtras();
if (extras != null) {
String jsonString = extras.getString("objectKey");
if(jsonString!=null){
Gson gson = new Gson();
ComplexJavaObj complexJavaObj= gson.fromJson(jsonString, ComplexJavaObj .class);
}
}
希望这会给你基本的想法。
答案 1 :(得分:-1)
这是Nick在Android Scala forum中提供给我的答案:
如果你了解你的方式,它应该是相对简单的:)
Here’s one序列化对(key, value)
。
从那里,您只需要添加案例类检查位。 Example(有点复杂),另请参阅第89行的使用情况。 最后,我会使它基于类型而不是基于继承:
trait Bundleable[A] {
def toBundle(x: A): Bundle
def fromBundle(b: Bundle): Try[A]
}
implicit def genBundleable[A]: Bundleable[A] = macro ???
def bundle[A: Bundleable](x: A) =
implicitly[Bundleable[A]].toBundle(x)
这样您就可以手动和自动定义Bundleable[A]
的实例。并且您的数据模型不会被Android废话污染。