public boolean equals(final Object o) {if (!(o instanceof Property)) {return false;}final Property p = (Property) o;final Object pValue = p.getValue();final long pId = p.getID();if (id != pId || (id != 0 && !typesAreEqual(type, p.getType()))) {return false;}if (value == null && pValue == null) {return true;}if (value == null || pValue == null) {return false;}final Class<?> valueClass = value.getClass();final Class<?> pValueClass = pValue.getClass();if (!(valueClass.isAssignableFrom(pValueClass)) &&!(pValueClass.isAssignableFrom(valueClass))) {return false;}if (value instanceof byte[]) {byte[] thisVal = (byte[]) value, otherVal = (byte[]) pValue;int len = unpaddedLength(thisVal);if (len != unpaddedLength(otherVal)) {return false;}for (int i=0; i<len; i++) {if (thisVal[i] != otherVal[i]) {return false;}}return true;}return value.equals(pValue);}

public override bool Equals(Object o){if (!(o is Property))return false;Property p = (Property)o;Object pValue = p.Value;long pId = p.ID;if (id != pId || (id != 0 && !TypesAreEqual(type, p.Type)))return false;if (value == null && pValue == null)return true;if (value == null || pValue == null)return false;Type valueClass = value.GetType();Type pValueClass = pValue.GetType();if (!(valueClass.IsAssignableFrom(pValueClass)) &&!(pValueClass.IsAssignableFrom(valueClass)))return false;if (value is byte[])return Arrays.Equals((byte[])value, (byte[])pValue);return value.Equals(pValue);}
