Java Keywords (Part XXIII): transient
Java keyword list
abstract | continue | for | new | switch |
assert | default | goto* | package | synchronized |
boolean | do | if | private | this |
break | double | implements | protected | throw |
byte | else | import | public | throws |
case | enum | instanceof | return | transient |
catch | extends | int | short | try |
char | final | interface | static | void |
class | finally | long | strictfp | volatile |
const* | float | native | super | while |
Keyword marked with an asterisk (*) are keywords that, although valid, are not used by programmers.
Before getting on how to use transient
, you must understand why you need to use it. And for that, you must understand the concept of serialization in Java. Serialization is simply the mechanism provided by the language to turn an instance of an object into a byte stream, so that it can be sent over the wire. Remember, objects encapsulate data. So serialization is basically creating a byte array to transmit the object's data. But this is not all. With serialization, the recipient of the serialized object will be able to recreate the serialized object on the other side. This is known as Deserialization.
What's involved in Serialization?
To serialize an object, you must first tag the class as "serializable" by implementing the Serializable interface. If you examine this interface, you will notice that the interface does not contain any methods or any declared constants inside of it. This it is what is referred to as a marker interface. It's sole purpose is to tell the JVM that objects of this type can be serialized. In Java, for example, the class String is serializable. According to the Serializable interface documentation, classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
public class Person implements Serializable {
private String name; // Objects must be serializable as well (String class is serializable)
private int age;
private int id;
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
// Some code here
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
// Some code here
}
private void readObjectNoData() throws ObjectStreamException {
// Some code here
}
// Constructor and other methods omitted
}
transient
?
Using the keyword transient
The sole purpose of this keyword is to mark the fields we DO NOT wish to send over in the byte stream when the object is serialized. You may be asking yourself, "why do I want to do that?" "What is the point?" Suppose the id
variable in the code example above contains an automatically generated value from a database. In this case, it might not be desirable to send over the value in the byte stream. Or perhaps you do not want the recipient of the data to see certain values for privacy reasons. This is where the keyword is used. Tagging a field with the keyword transient
excludes those fields when the byte stream is created.
public class Person implements Serializable {
private String name; // Objects must be serializable as well (String class is serializable)
private int age;
private transient int id; // This value will not be sent in the byte stream
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
// Some code here
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
// Some code here
}
private void readObjectNoData() throws ObjectStreamException {
// Some code here
}
// Constructor and other methods omitted
}
native
Comments
Post a Comment