Florescu George Cătălin Florescu George Cătălin - 1 year ago 48
Android Question

Firebase serialization names

I created an object to send some data to firebase. As an example, I use firebase user example:

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


I want to encode property names that are sent to firebase. Currently keys are sent using variable names. I want to encode keys something like
Useraname
and
Email
, like
Gson
is doing. I don't want to change variable names.

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


I used
@SerializateName()
, but is not working. Same with
@PropertyName
that is used by Firebse, is not working. What I can use in order to serializare custom keys?

Update 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;
}
}


As you can see in the image, it saves keys based on variable names. I changed property name from annotation for one field and when i save it, it ignores it, but when i change variable name, it save as new entry with key for that new varialbe name.

enter image description here

In this documentation is a method
toMap()
. If i do like that, is working (is not convenient for me), but is not working with
@PropertyName
.

Update 2

If i mark getters and setters with
@Exclude
and class with
@IgnoreExtraProperties
is working. I don't have to use
toMap()
method example from documetation. Is using specified name from
@PropertyName
. Not a good thing in my opinion, create confuses.

Answer Source

The Firebase SDK uses the annotation it finds for the property whenever it gets or sets its value. That means you need to consider how Firebase gets/sets the value, and annotate each place it looks.

Since you're declaring a getter method, Firebase will use that to get the value of the property. It will use the field for setting the value. So the annotation needs to be on both:

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

   @PropertyName("Name")
   public String name;

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

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

If you'd have getters and setters, the annotation would need to be on those, but not on the fields anymore:

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;
   }
}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download