/// <summary> /// <see cref="object.Equals(object)"/> /// </summary> public override bool Equals(object obj) { GenericObject GenObj = obj as GenericObject; if (this.collectionName != GenObj.collectionName || this.typeName != GenObj.typeName || this.objectId != GenObj.objectId) { return(false); } if (this.propertiesByName == null) { this.BuildDictionary(); } if (GenObj.propertiesByName == null) { GenObj.BuildDictionary(); } if (this.propertiesByName.Count != GenObj.propertiesByName.Count) { return(false); } foreach (KeyValuePair <string, object> P in this.propertiesByName) { if (!GenObj.propertiesByName.TryGetValue(P.Key, out object Value)) { return(false); } if (Value == null ^ P.Value == null) { return(false); } if (Value != null && !Value.Equals(P.Value)) { return(false); } } return(true); }
/// <summary> /// Gets the value of a field or property of an object, given its name. /// </summary> /// <param name="FieldName">Name of field or property.</param> /// <param name="Object">Object.</param> /// <param name="Value">Corresponding field or property value, if found, or null otherwise.</param> /// <returns>If the corresponding field or property was found.</returns> public override bool TryGetFieldValue(string FieldName, object Object, out object Value) { GenericObject Obj = (GenericObject)Object; return(Obj.TryGetFieldValue(FieldName, out Value)); }
/// <summary> /// Deserializes an object from a binary source. /// </summary> /// <param name="Reader">Deserializer.</param> /// <param name="DataType">Optional datatype. If not provided, will be read from the binary source.</param> /// <param name="Embedded">If the object is embedded into another.</param> /// <param name="CheckFieldNames">If field names are to be extended.</param> /// <returns>Deserialized object.</returns> public async Task <object> Deserialize(IDeserializer Reader, uint?DataType, bool Embedded, bool CheckFieldNames) { StreamBookmark Bookmark = Reader.GetBookmark(); uint? DataTypeBak = DataType; uint FieldDataType; ulong FieldCode; Guid ObjectId = Embedded ? Guid.Empty : Reader.ReadGuid(); string TypeName; string FieldName; string CollectionName; if (!Embedded) { Reader.SkipVariableLengthUInt64(); // Content length. } if (!DataType.HasValue) { DataType = Reader.ReadBits(6); if (DataType.Value == ObjectSerializer.TYPE_NULL) { return(null); } } switch (DataType.Value) { case ObjectSerializer.TYPE_OBJECT: if (Embedded && Reader.BitOffset > 0 && Reader.ReadBit()) { ObjectId = Reader.ReadGuid(); } break; case ObjectSerializer.TYPE_BOOLEAN: return(Reader.ReadBit()); case ObjectSerializer.TYPE_BYTE: return(Reader.ReadByte()); case ObjectSerializer.TYPE_INT16: return(Reader.ReadInt16()); case ObjectSerializer.TYPE_INT32: return(Reader.ReadInt32()); case ObjectSerializer.TYPE_INT64: return(Reader.ReadInt64()); case ObjectSerializer.TYPE_SBYTE: return(Reader.ReadSByte()); case ObjectSerializer.TYPE_UINT16: return(Reader.ReadUInt16()); case ObjectSerializer.TYPE_UINT32: return(Reader.ReadUInt32()); case ObjectSerializer.TYPE_UINT64: return(Reader.ReadUInt64()); case ObjectSerializer.TYPE_DECIMAL: return(Reader.ReadDecimal()); case ObjectSerializer.TYPE_DOUBLE: return(Reader.ReadDouble()); case ObjectSerializer.TYPE_SINGLE: return(Reader.ReadSingle()); case ObjectSerializer.TYPE_DATETIME: return(Reader.ReadDateTime()); case ObjectSerializer.TYPE_DATETIMEOFFSET: return(Reader.ReadDateTimeOffset()); case ObjectSerializer.TYPE_TIMESPAN: return(Reader.ReadTimeSpan()); case ObjectSerializer.TYPE_CHAR: return(Reader.ReadChar()); case ObjectSerializer.TYPE_STRING: return(Reader.ReadString()); case ObjectSerializer.TYPE_CI_STRING: return(new CaseInsensitiveString(Reader.ReadString())); case ObjectSerializer.TYPE_ENUM: return(Reader.ReadString()); case ObjectSerializer.TYPE_BYTEARRAY: return(Reader.ReadByteArray()); case ObjectSerializer.TYPE_GUID: return(Reader.ReadGuid()); case ObjectSerializer.TYPE_NULL: return(null); case ObjectSerializer.TYPE_ARRAY: throw new Exception("Arrays must be embedded in objects."); default: throw new Exception("Object or value expected."); } bool Normalized = this.NormalizedNames; if (Normalized) { FieldCode = Reader.ReadVariableLengthUInt64(); TypeName = null; } else { FieldCode = 0; TypeName = Reader.ReadString(); } if (Embedded) { if (Normalized) { ulong CollectionCode = Reader.ReadVariableLengthUInt64(); CollectionName = await this.Context.GetFieldName(null, CollectionCode); } else { CollectionName = Reader.ReadString(); } } else { CollectionName = Reader.CollectionName; } if (Normalized) { if (FieldCode == 0) { TypeName = string.Empty; } else if (CheckFieldNames) { TypeName = await this.Context.GetFieldName(CollectionName, FieldCode); } else { TypeName = CollectionName + "." + FieldCode.ToString(); } } if (this.returnTypedObjects && !string.IsNullOrEmpty(TypeName)) { Type DesiredType = Types.GetType(TypeName); if (DesiredType is null) { DesiredType = typeof(GenericObject); } if (DesiredType != typeof(GenericObject)) { IObjectSerializer Serializer2 = await this.Context.GetObjectSerializer(DesiredType); Reader.SetBookmark(Bookmark); return(await Serializer2.Deserialize(Reader, DataTypeBak, Embedded)); } } LinkedList <KeyValuePair <string, object> > Properties = new LinkedList <KeyValuePair <string, object> >(); int?ArchivingTime = null; while (true) { if (Normalized) { FieldCode = Reader.ReadVariableLengthUInt64(); if (FieldCode == 0) { break; } if (CheckFieldNames) { FieldName = await this.Context.GetFieldName(CollectionName, FieldCode); } else { FieldName = CollectionName + "." + FieldCode.ToString(); } } else { FieldName = Reader.ReadString(); if (string.IsNullOrEmpty(FieldName)) { break; } } FieldDataType = Reader.ReadBits(6); if (FieldDataType == ObjectSerializer.TYPE_INT32 && FieldName == "ArchivingTime" && !ArchivingTime.HasValue) { ArchivingTime = Reader.ReadInt32(); } else { switch (FieldDataType) { case ObjectSerializer.TYPE_BOOLEAN: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadBoolean())); break; case ObjectSerializer.TYPE_BYTE: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadByte())); break; case ObjectSerializer.TYPE_INT16: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadInt16())); break; case ObjectSerializer.TYPE_INT32: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadInt32())); break; case ObjectSerializer.TYPE_INT64: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadInt64())); break; case ObjectSerializer.TYPE_SBYTE: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadSByte())); break; case ObjectSerializer.TYPE_UINT16: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadUInt16())); break; case ObjectSerializer.TYPE_UINT32: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadUInt32())); break; case ObjectSerializer.TYPE_UINT64: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadUInt64())); break; case ObjectSerializer.TYPE_DECIMAL: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadDecimal())); break; case ObjectSerializer.TYPE_DOUBLE: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadDouble())); break; case ObjectSerializer.TYPE_SINGLE: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadSingle())); break; case ObjectSerializer.TYPE_DATETIME: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadDateTime())); break; case ObjectSerializer.TYPE_DATETIMEOFFSET: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadDateTimeOffset())); break; case ObjectSerializer.TYPE_TIMESPAN: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadTimeSpan())); break; case ObjectSerializer.TYPE_CHAR: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadChar())); break; case ObjectSerializer.TYPE_STRING: case ObjectSerializer.TYPE_ENUM: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadString())); break; case ObjectSerializer.TYPE_CI_STRING: Properties.AddLast(new KeyValuePair <string, object>(FieldName, new CaseInsensitiveString(Reader.ReadString()))); break; case ObjectSerializer.TYPE_BYTEARRAY: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadByteArray())); break; case ObjectSerializer.TYPE_GUID: Properties.AddLast(new KeyValuePair <string, object>(FieldName, Reader.ReadGuid())); break; case ObjectSerializer.TYPE_NULL: Properties.AddLast(new KeyValuePair <string, object>(FieldName, null)); break; case ObjectSerializer.TYPE_ARRAY: Properties.AddLast(new KeyValuePair <string, object>(FieldName, await this.ReadGenericArray(Reader))); break; case ObjectSerializer.TYPE_OBJECT: Properties.AddLast(new KeyValuePair <string, object>(FieldName, await this.Deserialize(Reader, FieldDataType, true))); break; default: throw new Exception("Unrecognized data type: " + FieldDataType.ToString()); } } } GenericObject Result = new GenericObject(CollectionName, TypeName, ObjectId, Properties); if (ArchivingTime.HasValue) { Result.ArchivingTime = ArchivingTime.Value; } return(Result); }