Java 爪哇语;“设置对象”;,序列化/反序列化

Java 爪哇语;“设置对象”;,序列化/反序列化,java,android,reflection,annotations,Java,Android,Reflection,Annotations,(代码实际上是针对Android的,我需要代码在Android和JavaSE之间可移植。) 我想有一个“设置”类与各种游戏设置,如 public int map_size; public String server_name; 等等 需要相当频繁地访问数据(因此是成员,而不是键值映射),并不时以某种标准方式进行反序列化(主要是通过网络发送) 我希望能够 将对象序列化并反序列化为XML或JSON,而不必为每个成员显式编写代码(但仍对格式有一定程度的控制) 定义关于每个成员的一些(常量)元数据(默

(代码实际上是针对Android的,我需要代码在Android和JavaSE之间可移植。)

我想有一个“设置”类与各种游戏设置,如

public int map_size;
public String server_name;
等等

需要相当频繁地访问数据(因此是成员,而不是键值映射),并不时以某种标准方式进行反序列化(主要是通过网络发送)

我希望能够

  • 将对象序列化并反序列化为XML或JSON,而不必为每个成员显式编写代码(但仍对格式有一定程度的控制)

  • 定义关于每个成员的一些(常量)元数据(默认值、GUI名称、XML标识符等),以便于在源代码中进行修改(我希望能够添加一个新的元属性,为它定义一个默认值,而不必在其他任何地方指定它)

  • 1可以通过使用反射来实现。我认为类成员的Java注释非常适合2:

    @Setting(id = "server_name", name = "Server title", default = "Server0")
    public String server_name;
    
    但看起来(用户定义的)注释在Android中还不起作用-使用它们的代码会使编译器崩溃

    存储有关设置的元数据的最简单方法是什么(或者其他方法)

    • 是否在某些外部XML文件中存储有关设置的信息

    • 将其存储在Java数据结构中,并在代码中定义内容?以这种方式定义数据似乎非常笨拙,尤其是与注释的关键字参数相比

    • ?


      • 您不使用的原因有哪些?只要所有游戏设置都是原语(或字符串),那么这可能是存储首选项的最简单方法。此外,如果您最终创建了一个设置页面(ApiDemos中有一些首选项示例),那么它也可以很好地与同步。

        而我不确定它们在Android上的工作情况如何,或者提供了高度可定制的XML或Java对象的JSON(反)序列化。请注意,XStream同时支持XML和JSON输出,Jackson只是JSON。

        FYI,看起来Jackson将在Jackson 0.9.7版本中使用Android


        尽管我同意Daniel Lew的观点,使用内置的Android首选项是Android客户端的最佳解决方案。对于JavaSE客户机,Properties类是存储首选项的好方法。还有一个JavaSE preferences包,但它可能比您需要的做得更多。

        很抱歉没有澄清,但我希望这部分代码是可移植的(我希望设置可以快速访问,这就是为什么我更喜欢它们作为类成员的原因)。不管怎么说,感谢你的提示,用preferences API同步游戏设置可能是值得的。Jackson成功了,但性能方面存在一些问题(特别是在第一次启动模块时——我们通过在程序开始时启动的单独线程中“预热”模块来解决)。