...
Use of the Employee
object as a key to the map is insecure because the properties of the object may change after an ordering has been established. For example, a client may modify the name
field when the last name of an employee changes. ConsequentlyAs a result, clients may observe non-deterministic behavior.
...
Many programmers are surprised by an instance of hashcode hash code mutability that arises due to because of serialization. The contract for the hashCode()
method lacks any requirement that hashcodes hash codes remain consistent across different executions of an application. Similarly, when an object is serialized and subsequently deserialized, its hashcode after deserialization may be inconsistent with its original hashcode.
...
To successfully store and retrieve objects from a hashtablehash table, the objects used as keys must implement the
hashCode
method and theequals
method.
...
Code Block | ||
---|---|---|
| ||
class Key implements Serializable { // Does not override hashCode() } class HashSer { public static void main(String[] args) throws IOException, ClassNotFoundException { Hashtable<Key,String> ht = new Hashtable<Key, String>(); Key key = new Key(); ht.put(key, "Value"); System.out.println("Entry: " + ht.get(key)); // Retrieve using the key, works // Serialize the Hashtable object FileOutputStream fos = new FileOutputStream("hashdata.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(ht); oos.close(); // Deserialize the Hashtable object FileInputStream fis = new FileInputStream("hashdata.ser"); ObjectInputStream ois = new ObjectInputStream(fis); Hashtable<Key, String> ht_in = (Hashtable<Key, String>)(ois.readObject()); ois.close(); if (ht_in.contains("Value")) // Check whether the object actually exists in the Hashtablehash table System.out.println("Value was found in deserialized object."); if (ht_in.get(key) == null) // Gets printed System.out.println("Object was not found when retrieved using the key."); } } |
...
Code Block | ||
---|---|---|
| ||
class HashSer {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Hashtable<Integer, String> ht = new Hashtable<Integer, String>();
ht.put(new Integer(1), "Value");
System.out.println("Entry: " + ht.get(1)); // Retrieve using the key
// Serialize the Hashtable object
FileOutputStream fos = new FileOutputStream("hashdata.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(ht);
oos.close();
// Deserialize the Hashtable object
FileInputStream fis = new FileInputStream("hashdata.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Hashtable<Integer, String> ht_in = (Hashtable<Integer, String>)(ois.readObject());
ois.close();
if (ht_in.contains("Value")) // Check whether the object actually exists in the Hashtable
System.out.println("Value was found in deserialized object.");
if (ht_in.get(1) == null) // Not printed
System.out.println("Object was not found when retrieved using the key.");
}
}
|
...