Transient Modifier In Java

Nov 18, 2020  ·  ~2min read
Notes #java #serialization

Data serialization library in Java could be varied. You can use Jackson, GSON, or anything else. Since there are too many serialization libraries out there, it’s quite tricky to manage Java class attribute exclusion during serialization. Each library might have their own way to exclude the Java class attribute. Each Java project should only have 1 serialization library in order to maintain the standardization but, what if somehow in someway you need more than one serialization library?

Here comes transient modifier that helps you manage the java class attribute exclusion during serialization in language level. There’s no need to memorize unique annotation like

@Expose(serialize = false, deserialize = true)

or

@JsonIgnore

You can only use transient keyword as your attribute modifier. Let’s try it.

Sample Class

// Jackson need this annotation
// because it can't deserialize unknown properties. duh!
@JsonIgnoreProperties(ignoreUnknown = true)
public class Sample {
  // using transient modifier on foo
  public transient String foo;
  public String bar;

  @Override
  public String toString() {
    return "Sample{" +
        "foo='" + foo + '\'' +
        ", bar='" + bar + '\'' +
        '}';
  }

  public static void main(String[] args) throws Exception {
    String json = "{\"foo\":\"foox\",\"bar\":\"barx\"}";

    // by default jackson not reading any attribute,
    // jackson only read public default Getter
    // so jackson need to have this configuration to mark transient attributes
    ObjectMapper jackson = new ObjectMapper()
        .configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
    Gson gson = new Gson();

    Sample byJackson = jackson.readValue(json, Sample.class);
    Sample byGson = gson.fromJson(json, Sample.class);

    System.out.println("deserialization by jackson: " + byJackson);
    System.out.println("deserialization by gson: " + byGson);

    System.out.println("serialization by gson: " + gson.toJson(byGson));
    System.out.println("serialization by jackson: " + jackson.writeValueAsString(byJackson));
  }
}

output

deserialization by jackson: Sample{foo='null', bar='barx'}
deserialization by gson: Sample{foo='null', bar='barx'}
serialization by gson: {"bar":"barx"}
serialization by jackson: {"bar":"barx"}

Yep, as we expect, foo attribute isn’t serialized. transient modifier would work just fine as long as the attribute itself has no static or final modifier. Whenever a transient attribute has static or final modifier, the transient modifier has no effect on that attribute.

Thank you for reading!