public enum MyEnum { A, B } public class MyChildObject { private String m_MyChildField = new String(); public String getMyChildField() { return m_MyChildField; } public void setMyChildField(String value) { m_MyChildField = value; } } public class MyObject { private int m_MyField; private MyChildObject m_MyObjectField = new MyChildObject(); private ArrayList m_MyListField = new ArrayList(); private MyEnum m_MyEnumField; private DateTime m_MyDateTimeField = new DateTime(); public int getMyField() { return m_MyField; } public void setMyField(int value) { m_MyField = value; } public MyChildObject getMyObjectField() { return m_MyObjectField; } public void setMyObjectField(MyChildObject value) { m_MyObjectField = value; } public ArrayList getMyListField() { return m_MyListField; } public void setMyListField(ArrayList value) { m_MyListField = value; } public MyEnum getMyEnumField() { return m_MyEnumField; } public void setMyEnumField(MyEnum value) { m_MyEnumField = value; } public DateTime getMyDateTimeField() { return m_MyDateTimeField; } public void setMyDateTimeField(DateTime value) { m_MyDateTimeField = value; } } public boolean equals(Object obj) { if(obj == this) { return true; } if(obj == null || !(obj instanceof MyChildObject)) { return false; } MyChildObject realObj = (MyChildObject)obj; if(!(getMyChildField().equals(realObj.getMyChildField()))) { return false; } return true; } public boolean equals(Object obj) { if(obj == this) { return true; } if(obj == null || !(obj instanceof MyObject)) { return false; } MyObject realObj = (MyObject)obj; if(!(getMyField().equals(realObj.getMyField()))) { return false; } if(!(getMyObjectField().equals(realObj.getMyObjectField()))) { return false; } if(!(getMyListField().equals(realObj.getMyListField()))) { return false; } if(!(getMyEnumField().equals(realObj.getMyEnumField()))) { return false; } if(!(getMyDateTimeField().equals(realObj.getMyDateTimeField()))) { return false; } return true; } public int hashcode() { return getMyChildField().hashcode(); } public int hashcode() { return getMyField().hashcode() ^ getMyObjectField().hashcode() ^ getMyListField().hashcode() ^ getMyEnumField().hashcode() ^ getMyDateTimeField().hashcode(); } public void serialize(MyChildObject obj, DataOutputStream writer) { writer.writeInt(obj.getMyChildField().length()); if(obj.getMyChildField().length() > 0) { writer.writeBytes(obj.getMyChildField()); } } public void serialize(MyObject obj, DataOutputStream writer) { writer.writeInt(obj.getMyField()); serialize(obj.getMyObjectField(), writer); writer.writeLong(obj.getMyListField().size()); for(long listObj : obj.getMyListField()) { writer.writeLong(listObj); } writer.writeInt((int)obj.getMyEnumField()); writer.writeLong(obj.getMyDateTimeField().getTime()); } public void deserialize(MyChildObject obj, DataInputStream reader) { int countOfMyChildField = reader.readInt(); String result = ""; if(countOfMyChildField > 0) { byte[] bytes = new byte[countOfMyChildField]; reader.readBytes(bytes, 0, countOfMyChildField); result = new String(bytes); } obj.setMyChildField(result); } public void deserialize(MyObject obj, DataInputStream reader) { obj.setMyField(reader.readInt()); deserialize(obj.getMyObjectField(), reader); int countOfMyListField = reader.readInt(); for(int i = 0; i < countOfMyListField; ++i) { long listObj; listObj = reader.readLong(); obj.getMyListField().add(listObj); } obj.setMyEnumField((MyEnum)reader.readInt()); obj.setMyDateTimeField(new DateTime(reader.readLong())); }