(反)序列自动对象到束((De)Serializing objects automatically

2019-11-03 09:05发布

我已经看到了在斯卡拉有些库可(德)自动序列化已自动支撑部类型,即无论如何类JSON 。

在Android的世界里,我希望能够与意图,并捆绑这样做。

例如,我想生成该样板代码:

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)
}

确实存在这样的库或我有我自己做呢?

传递活动之间以及处理复杂的信息活动 onSaveInstanceState()onRestoreInstanceState()这个工具将是真棒。

Answer 1:

您可以使用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);
  }
}

希望这会给你的基本理念。



Answer 2:

这是尼克给我提供了一个答案的Android斯卡拉论坛 :

它应该是相对简单的,如果你知道周围宏自己的方式:) 这里有一个序列化对(key, value)

从那里,你只需要添加的情况下,分级检查一下。 实施例 (有点令人费解的),也看到了使用线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废话污染。



文章来源: (De)Serializing objects automatically to a bundle