【问题标题】:Firebase serialization namesFirebase 序列化名称
【发布时间】:2017-07-25 14:24:11
【问题描述】:

我创建了一个对象来向 firebase 发送一些数据。例如,我使用 firebase 用户示例:

public class User {
    public String username;
    public String email;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }
}

我想对发送到 firebase 的属性名称进行编码。目前,密钥是使用变量名发送的。我想对UseranameEmail 之类的键进行编码,就像Gson 正在做的那样。我不想更改变量名。

@SerializateName("Username")
public String username;
@SerializateName("Username")
public String email;

我使用了@SerializateName(),但无法正常工作。与 Firebse 使用的 @PropertyName 相同,但无法正常工作。我可以使用什么来序列化自定义键?

更新 1

public class Pojo {
    @PropertyName("Guid")
    public String guid;

   @PropertyName("Name")
   public String name;

   public String getPojoGuid() {
       return guid;
   }

   public void setPojoGuid(String guid) {
       this.guid = guid;
   }
}

如图所示,它根据变量名保存键。我从一个字段的注释中更改了属性名称,当我保存它时,它会忽略它,但是当我更改变量名称时,它会保存为带有该新变量名称的键的新条目。

this 文档中是一个方法toMap()。如果我这样做,则可以工作(对我来说不方便),但不能使用@PropertyName

更新 2

如果我用@Exclude 标记getter 和setter 并且用@IgnoreExtraProperties 标记类正在工作。我不必使用文档中的toMap() 方法示例。正在使用来自 @PropertyName 的指定名称。在我看来不是一件好事,制造混乱。

【问题讨论】:

  • @PropertyName 适用于我的 SDK 版本 11.0.2。你用的是什么版本?
  • 请分享在您使用PropertyName 注释序列化/反序列化 POJO 时重现问题的最少代码。
  • @FrankvanPuffelen 我更新了我的问题。够了吗?
  • 你能帮我解决这个question吗?

标签: android firebase firebase-realtime-database


【解决方案1】:

Firebase SDK 在获取或设置属性值时使用它为属性找到的注释。这意味着您需要考虑 Firebase 如何获取/设置值,并注释它看起来的每个地方。

由于您声明了 getter 方法,Firebase 将使用它来获取属性的值。它将使用该字段来设置值。所以注释需要在两者上:

public class Pojo {
   @PropertyName("Guid")
   public String guid;

   @PropertyName("Name")
   public String name;

   @PropertyName("Guid")
   public String getPojoGuid() {
       return guid;
   }

   @PropertyName("Guid")
   public void setPojoGuid(String guid) {
       this.guid = guid;
   }
}

如果您有 getter 和 setter,则注释需要在它们上,而不是在字段上:

public class Pojo {
   private String guid;
   private String name;

   @PropertyName("Guid")
   public String getPojoGuid() {
       return guid;
   }

   @PropertyName("Guid")
   public void setPojoGuid(String value) {
       guid = value;
   }

   @PropertyName("Name")
   public void setPojoGuid(String guid) {
       this.guid = guid;
   }

   @PropertyName("Name")
   public void setPojoGuid(String value) {
       name = value;
   }
}

【讨论】:

  • 在这种情况下我可以使用私有字段吗?
  • 是的。好点子。我更新了答案中的代码片段。请注意,您也可以只使用没有 getter 的公共字段。我现在经常在回答中这样做,只是因为共享的代码更少。
【解决方案2】:

@PropertyName:

在序列化时标记要重命名的字段。 link

您必须将 @PropertyName 与公共字段一起使用,并且不需要 getter/setter

【讨论】:

  • 不工作。它更新具有相同变量名的键,例如username,而不是@PropertyName("Username")
  • 你能帮我解决这个question吗?
【解决方案3】:

您正在寻找的是 SDK 版本 9.2 的功能,您现在可以在其中使用新的@PropertyName 属性来指定将字段从 Java 模型类序列化到数据库时使用的名称。这将替换 @JsonProperty 属性。

@PropertyName("Username")
public String username;
@PropertyName("Email")
public String email;

另请参阅post,Frank van Puffelen 在其中非常清楚地解释了这个概念。

【讨论】:

  • 我用的是最新版本。我在我的问题中指定我尝试使用@PropertyName
猜你喜欢
  • 2017-04-03
  • 2018-06-20
  • 1970-01-01
  • 2017-11-29
  • 2013-10-09
  • 2014-04-24
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多