Hi, we have c++ ignite client and java client to read/write to the same cache. Our key is a composite object, my cache is IgniteCache<Key, Value>
-------c++ ------------------- namespace ignite { namespace binary { struct Key { std::string id; bool flag; Key() : id() , flag(false) { } Key(const std::string& id, bool flag = false) : id(id) , flag(flag) { } Key(const Key& rhs) : id(rhs.id) , flag(rhs.flag) { } bool operator<(const Key& rhs) const { return (id == rhs.id) ? flag < rhs.flag : id < rhs.id; } bool operator==(const Key& rhs) const { return id == rhs.id && flag == rhs.flag; } bool operator!=(const Key& rhs) const { return !(*this == rhs); } ~Key() { } // METHODS bool isEmpty() const { return id.empty(); } }; template<> struct BinaryType<Key> { static int32_t GetTypeId() { return GetBinaryStringHashCode("Key"); } static void GetTypeName(native_std::string& dst) { dst = "Key"; } static int32_t GetFieldId(const char* name) { return GetBinaryStringHashCode(name); } static bool IsNull(const Key& key) { return und.isEmpty(); } static void GetNull(Key& key) { key = Key(); } static void Write(BinaryWriter& writer, Key& key) { writer.WriteString("id", key.id); writer.WriteBool("flag", key.flag); } static void Read(BinaryReader& reader, Key& key) { key.id = reader.ReadString("id"); key.flag = reader.ReadBool("flag"); } int32_t GetHashCode(const Key& key) const { const int32_t prime = 31; int32_t boolHashCode = key.is_delayed ? 1231 : 1237; int32_t strHashCode = 0; for (int i = 0; i < (int)key.bbgid.size(); ++i) { strHashCode = prime * strHashCode + key.bbgid[i]; } return strHashCode + prime * boolHashCode; } }; } } Our java key is ------------------------------------------------------------------- mport org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.binary.BinaryReader; import org.apache.ignite.binary.BinaryWriter; import org.apache.ignite.binary.Binarylizable; public class Key implements Binarylizable { public String id; public Boolean flag; private final static int prime = 31; public Key() { //no-op } public Key(String id) { this.id = id; this.flag = false; } public Key(String id, boolean flag) { this.id = id; this.flag = flag; } @Override public int hashCode() { int boolHashCode = flag ? 1231 : 1237; int strHashCode = 0; for (int i = 0; i < id.length(); i++) { strHashCode = prime * strHashCode + id.charAt(i); } return strHashCode + prime * boolHashCode; } @Override public boolean equals(Object o) { if (o == this) { return true; } if (!(o instanceof Key)) { return false; } Key cast = (Key) o; return this.id.equals(cast.id) && this.flag == cast.flag; } public void readBinary(BinaryReader reader) throws BinaryObjectException { id = reader.readString("id"); flag = reader.readBoolean("flag"); } public void writeBinary(BinaryWriter writer) throws BinaryObjectException { writer.writeString("id", id); writer.writeBoolean("flag", flag); } @Override public String toString() { return "Key = [" + id + " " + flag + "]\n"; } } I see people put the GetHashCode in c++ BinaryType, some one use static, and others just put it as a const method. This GetHashCode implements hash code as java class Key. Where this GetHashCode is used ? Say if I write a record from c++ client, is this key the cache hash key ? Do I also need to implement hash in c++ class Key ? Is this GetHhashCode needed to be static ? How does ignite ensure cross plat form read/write when key is not primitive object (a composite object) ? Thanks -- Sent from: http://apache-ignite-users.70518.x6.nabble.com/