(De)自动将对象序列化为包

时间:2014-10-22 07:03:11

标签: android scala serialization deserialization

我已经看到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(),此工具非常棒。

2 个答案:

答案 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废话污染。