使用Firebase保存Java枚举的最佳方法是什么

使用Firebase保存Java枚举的最佳方法是什么,java,firebase,Java,Firebase,我正在使用谷歌的Firebase。我在一个模型类中放置了一个Java枚举作为成员之一。实例保存到Firebase数据库时,会引发异常。解决问题的最佳方法是什么?找到了我问题的部分答案,但仍在寻找解决办法 如果定义如下所示的枚举和模型类,那么突然之间,枚举成功地持久化为一个2节点结构,typename作为父级,枚举的字符串值作为子级。但当我尝试读取代码为Job j=xxx.getValueJob.class的节点时,将引发异常:com.google.firebase.database.Databa

我正在使用谷歌的Firebase。我在一个模型类中放置了一个Java枚举作为成员之一。实例保存到Firebase数据库时,会引发异常。解决问题的最佳方法是什么?

找到了我问题的部分答案,但仍在寻找解决办法

如果定义如下所示的枚举和模型类,那么突然之间,枚举成功地持久化为一个2节点结构,typename作为父级,枚举的字符串值作为子级。但当我尝试读取代码为Job j=xxx.getValueJob.class的节点时,将引发异常:com.google.firebase.database.DatabaseException:class com.ranchosoftware.ranchomovingandstorage.model.JobLifecycle缺少构造函数。根据Frank的评论,我认为Firebase目前没有解决方案。我不确定什么是最好的解决办法

public enum JobLifecycle  {
  New, inTransit, inStorage, delivered, signedOff;

  JobLifecycle(){}

  String value;

  @JsonValue
  public String getValue(){
    return this.name();
  }

  @JsonCreator
  public static JobLifecycle fromValue(String jobLifecycleString){
    for (JobLifecycle l : JobLifecycle.values()){
      if (l.name().equals(jobLifecycleString)){
        return l;
      }
    }
    throw new IllegalArgumentException("Invalid jobLifecycle code: " + jobLifecycleString);
  }
}
在模型类中使用它,如下所示:

public class Job {
  ... // other fields omitted
  JobLifecycle lifecycle;

  public Job(){
  }

  ... // other content omitted

  @JsonProperty("lifecycle")
  public JobLifecycle getLifecycle(){
    return lifecycle;
  }
}

经过进一步研究。以下是Firebase 3.0.0的解决方案。显然,Firebase以前的版本对Jackson有更灵活的支持,但已被取消。下面是一个带有enum的作业类,它可以处理黑客代码

public class Job {
  public enum JobLifecycle  {
    New, inTransit, inStorage, delivered, signedOff;
  }

  ...// other fields omitted
  JobLifecycle lifecycle;

  public Job(){
  }


  @Exclude
  public JobLifecycle getLifecycleAsEnum(){
    return lifecycle;
  }

  // these methods are just a Firebase 9.0.0 hack to handle the enum
  public String getLifecycle(){
    if (lifecycle == null){
      return null;
    } else {
      return lifecycle.name();
    }
  }

  public void setLifecycle(String lifecycleString){
    if (lifecycleString == null){
      lifecycle = null;
    } else {
      this.lifecycle = JobLifecycle.valueOf(lifecycleString);
    }
  }
}

我不知道Firebase的具体情况,但通常在使用基于文本的数据库(如JSON/Mongo)时,首选的方法是使用枚举名称。很高兴听到您找到了解决方案。您可以添加一些代码来说明如何在代码中使用该类吗?如果您可以指定您使用的Firebase版本,那也太好了,因为自从最新版本Google Play Services 9.0以来,JsonProperty注释就不再包含了。我正在使用Firebase 9.0.0和Google Play Services 9.0.0。我还没有很多使用Firebase的经验,添加@Jsonxxx注释刚刚奏效。如果没有注释和额外代码,保存将引发异常。在接下来的几天里,我可能会进一步了解为什么这会起作用,我会更新。在9.0.0版本中,我们还没有@JsonProperty的替代品。但我们将在即将发布的版本中添加一个,这样您就可以从应用程序中删除Jackson依赖项并减少APK大小。非常感谢,这对我来说很有效,但这是一个解决方法,有什么解决方案吗?我认为这仍然是Java中最好的方法。