如何在Android上使用Wobly序列化程序

时间:2012-02-17 19:20:37

标签: java android serialization

我正在寻找在Android项目中序列化对象的替代方法。我发现Wobly似乎很快而且很小。我理解如何使用Wobly创建WoblyImpl包装器,但我完全混淆如何从文件系统中读取/读取这些对象?何时运行WoblyGenerator并且可以在我的代码中完成?有人可以发布代码示例吗?

2 个答案:

答案 0 :(得分:1)

Wobly不支持未知的Object字段。所以字段如:

Object a;
List<Object> b;
Map<Integer, Object> c;

无法使用Wobly序列化。 它支持所有原始类(及其盒装对应物),所有Wobly类,上述任何数组/列表/地图组合。

所以在你的情况下,问题是JSONArray实现了List<Object>。如果您知道对象JSONArray包含哪种对象,例如List<Map<Integer, String>>,您可以写:

class Example extends WoblyImpl {
  @WoblyField(id = 0)
  List<Map<Integer, String>> array;

  public void setArray(JSONArray json) {
    array = (List)json;
  }
}

虽然在反序列化后,您将获得ArrayList<HashMap<Integer,String>>而不是JSONArray

如果您不知道对象JSONArray持有什么,如果可能的话,让它与Wobly一起工作会很痛苦。您可以在此处查看序列化库的全面比较: https://github.com/eishay/jvm-serializers/wiki

答案 1 :(得分:0)

好的,我明白了。如果您在这里想知道并且想要知道如何操作,请执行以下步骤:

  1. 通过扩展WoblyImpl创建您的类,并根据the instructions
  2. 注释字段
  3. 然后运行WoblyGenerator.updateSourceFolder("c:/foo/src");,其中参数是包含您的文件(或包)的目录。我在Eclipse中为此创建了一个小项目,但您也可以使用提供的wobly-generator.jar从命令行运行它。
  4. 此步骤将序列化代码注入源文件,其中包括读写方法
  5. Gotcha :这不适用于smart-json JSONObject或JSONArray或HashMap。我得到的错误是:

    java.lang.IllegalArgumentException: next type for class net.minidev.json.JSONObject of  index 0, class java.lang.Class
    at  com.wowd.wobly.generation.WoblyGeneratorUtils.extractNextType(WoblyGeneratorUtils.java:91)
    at   com.wowd.wobly.generation.types.impl.MapTypeCodeGenerator.defaultTypeFormat(MapTypeCodeGenerator.java:163)
    at com.wowd.wobly.generation.types.TypeCodeHandler.defaultTypeFormat(TypeCodeHandler.java:121)
    at com.wowd.wobly.generation.WoblyGeneratorUtils.adjusFormatForCompressed(WoblyGeneratorUtils.java:317)
    at com.wowd.wobly.generation.WoblyCodeGenerator.generateWriteFieldCode(WoblyCodeGenerator.java:178)
    at com.wowd.wobly.generation.WoblyCodeGenerator.generateWriteMethod(WoblyCodeGenerator.java:270)
    at com.wowd.wobly.generation.WoblyCodeGenerator.generateFieldsAndMethods(WoblyCodeGenerator.java:647)
    at com.wowd.wobly.generation.WoblyCodeGenerator.generateRegularCode(WoblyCodeGenerator.java:721)
    at com.wowd.wobly.generation.WoblyCodeGenerator.generateCode(WoblyCodeGenerator.java:677)
    at com.wowd.wobly.updater.GenerateAndReplace.update(GenerateAndReplace.java:130)
    at com.wowd.wobly.updater.GenerateAndReplace$1.execute(GenerateAndReplace.java:198)
    at com.wowd.wobly.updater.GenerateAndReplace$1.execute(GenerateAndReplace.java:1)
    at com.wowd.common.functions.impl.FilterProcedure.execute(FilterProcedure.java:40)
    at com.wowd.wobly.updater.SourceFilesVisitor.visitDir(SourceFilesVisitor.java:69)
    at com.wowd.wobly.updater.SourceFilesVisitor.visitDir(SourceFilesVisitor.java:60)
    at com.wowd.wobly.updater.SourceFilesVisitor.visitDir(SourceFilesVisitor.java:60)
    at com.wowd.wobly.updater.SourceFilesVisitor.visitDir(SourceFilesVisitor.java:60)
    at com.wowd.wobly.updater.SourceFilesVisitor.visitPackage(SourceFilesVisitor.java:38)
    at com.wowd.wobly.updater.GenerateAndReplace.updateInPackage(GenerateAndReplace.java:190)    WoblyParcel                             error
    
    at com.wowd.wobly.WoblyGenerator.updatePackage(WoblyGenerator.java:60)
    at com.wowd.wobly.WoblyGenerator.updateSourceFolder(WoblyGenerator.java:49)
    at Generator.main(Generator.java:19)
    
  6. 如果有人可以告诉我如何解决这个问题 - 将其作为单独的答案发布,我会接受它