I have a PaymentPreference class which has a hashmap to store all paymentmethods opted by consumer while he created his profile. This PaymentMethod is another class whose object are stored in this PaymentPreference hashmap as key and a Boolean object as its value. This is all done this way for some specific purpose.
Comming to the issue, i have a case where i need to serialize this PaymentPreference which has this Hashmap with PaymentMethod object as key. So, before serialize , i check if a specific key is present in Hashmap using containsKey and it returns true. After that i went with serialization. But, when i deserialize the PaymentPreference object and try to check if same key is present in hashmap using the contains key method, i am getting false. This looked strange as i knew that the key is there in Hashmap. But somehow, after serialization, i was unable to find a match for that key using containsKey method.
Since it is all about matching an object, i tried printing the hash code values of the hashmap keys before and after serialization and there it is. There is a difference in the hashcode value of the hashmap key before and after serialization. This is the reason my containsKey method not returning true after deserialization. I have no idea why it is happening like this. I haven't done much work on serialization, it is just now for some specific case i had to do this. I dont find any convincing answer in already existing threads on this. Can somebody shed some light on why this is happening and what should i do to prevent this ?
PFB my classes
PaymentMethods Class
public class PaymentMethods implements java.io.Serializable{
/**
*
*/
private static final long serialVersionUID = 3398741949646654368L;
private String paymentMethod;
public static final PaymentMethods CASH = new PaymentMethods("CashPayment");
public static final PaymentMethods BITCOIN = new PaymentMethods("BitCoin");
public static final PaymentMethods CARD = new PaymentMethods("Card");
public static final PaymentMethods CHEQUE= new PaymentMethods("Cheque");
public static final PaymentMethods MPAY= new PaymentMethods("MobPay");
public static final PaymentMethods PAYME= new PaymentMethods("PayMe");
public PaymentMethods(String paymentMethod) {
this.paymentMethod=paymentMethod;
}
/**
* @return the paymentMethod
*/
public String getPaymentMethod() {
return this.paymentMethod;
}
}
PaymentPreferences Class
import java.util.HashMap;
import java.util.Map;
public class PaymentPreferences implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 7475358849630530148L;
//preferences with on/off
private Map<PaymentMethods,Boolean> paymentPreferenceMap = new HashMap<PaymentMethods,Boolean> ();
/**
* @return the paymentPreferenceMap
*/
public Map<PaymentMethods, Boolean> getPaymentPreferenceMap() {
return paymentPreferenceMap;
}
public void addSelectedPreferences(PaymentMethods paymentMethod){
paymentPreferenceMap.put(paymentMethod, Boolean.TRUE);
}
public boolean isCashPaymentPreferred(PaymentMethods inputPaymentMethod){
return paymentPreferenceMap.containsKey(inputPaymentMethod);
}
@Override
public String toString() {
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("Is CashPayment Preferred ? -> "+isCashPaymentPreferred(PaymentMethods.CASH));
return sBuffer.toString();
}
}
Class to test Serialize/Deserialize
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Set;
public class TestSerialize {
private PaymentPreferences paymentPreference;
public static void main(String[] args) {
TestSerialize testObj=new TestSerialize();
testObj.initializeData();
testObj.serializeData();
testObj.deSerializeData();
}
private void deSerializeData() {
Object object=null;
System.out.println("Deserializing ");
try {
FileInputStream fis = new FileInputStream("D:\\TestPref.dat");
ObjectInputStream ois= new ObjectInputStream(fis);
object = ois.readObject();
ois.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("After Deserialization, Cash Preference check -> "+(PaymentPreferences)object);
System.out.println("After Deserialization,hash code value for map key ->");
printHashCodeForKeys(((PaymentPreferences)object));
}
private void serializeData() {
System.out.println("Before Serialization, Cash Preference check -> "+paymentPreference);
System.out.println("Before Serialization,hash code value for map key ->");
printHashCodeForKeys(paymentPreference);
try {
FileOutputStream fos = new FileOutputStream("D:\\TestPref.dat");
ObjectOutputStream ous= new ObjectOutputStream(fos);
ous.writeObject(paymentPreference);
ous.close();
fos.close();
System.out.println("Serialization done");
System.out.println();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void printHashCodeForKeys(PaymentPreferences paymentPreference) {
Set<PaymentMethods> keySet=paymentPreference.getPaymentPreferenceMap().keySet();
for(PaymentMethods methodObj:keySet) {
System.out.println(methodObj.hashCode());
}
System.out.println("Hashcode for PaymentMethods.CASH object is "+PaymentMethods.CASH.hashCode());
}
private void initializeData() {
paymentPreference = new PaymentPreferences();
paymentPreference.addSelectedPreferences(PaymentMethods.CASH);
}
}
OUTPUT:
Before Serialization, Cash Preference check -> Is CashPayment Preferred ? -> true
Before Serialization,hash code value for map key ->
1096192577
Hashcode for PaymentMethods.CASH object is 1096192577
Serialization done
Deserializing
After Deserialization, Cash Preference check -> Is CashPayment Preferred ? -> false
After Deserialization,hash code value for map key ->
428583986
Hashcode for PaymentMethods.CASH object is 1096192577