/// <summary> /// Serializes an object to a binary destination. /// </summary> /// <param name="Writer">Binary destination.</param> /// <param name="WriteTypeCode">If a type code is to be output.</param> /// <param name="Embedded">If the object is embedded into another.</param> /// <param name="Value">The actual object to serialize.</param> public override void Serialize(BinarySerializer Writer, bool WriteTypeCode, bool Embedded, object Value) { if (Value is GenericObject TypedValue) { BinarySerializer WriterBak = Writer; IObjectSerializer Serializer; object Obj; if (!Embedded) { Writer = new BinarySerializer(Writer.CollectionName, Writer.Encoding, true); } if (WriteTypeCode) { if (TypedValue == null) { Writer.WriteBits(ObjectSerializer.TYPE_NULL, 6); return; } else { Writer.WriteBits(ObjectSerializer.TYPE_OBJECT, 6); } } else if (TypedValue == null) { throw new NullReferenceException("Value cannot be null."); } if (string.IsNullOrEmpty(TypedValue.TypeName)) { Writer.WriteVariableLengthUInt64(0); } else { Writer.WriteVariableLengthUInt64(this.provider.GetFieldCode(TypedValue.CollectionName, TypedValue.TypeName)); } if (Embedded) { Writer.WriteVariableLengthUInt64(this.provider.GetFieldCode(null, string.IsNullOrEmpty(TypedValue.CollectionName) ? this.provider.DefaultCollectionName : TypedValue.CollectionName)); } foreach (KeyValuePair <string, object> Property in TypedValue) { Writer.WriteVariableLengthUInt64(this.provider.GetFieldCode(TypedValue.CollectionName, Property.Key)); Obj = Property.Value; if (Obj == null) { Writer.WriteBits(ObjectSerializer.TYPE_NULL, 6); } else { if (Obj is GenericObject) { this.Serialize(Writer, true, true, Obj); } else { Serializer = this.provider.GetObjectSerializer(Obj.GetType()); Serializer.Serialize(Writer, true, true, Obj); } } } Writer.WriteVariableLengthUInt64(0); if (!Embedded) { if (!TypedValue.ObjectId.Equals(Guid.Empty)) { WriterBak.Write(TypedValue.ObjectId); } else { Guid NewObjectId = ObjectBTreeFile.CreateDatabaseGUID(); WriterBak.Write(NewObjectId); TypedValue.ObjectId = NewObjectId; } byte[] Bin = Writer.GetSerialization(); WriterBak.WriteVariableLengthUInt64((ulong)Bin.Length); WriterBak.WriteRaw(Bin); } } else { IObjectSerializer Serializer = this.provider.GetObjectSerializer(Value.GetType()); Serializer.Serialize(Writer, WriteTypeCode, Embedded, Value); } }
/// <summary> /// Serializes an object to a binary destination. /// </summary> /// <param name="Writer">Binary destination.</param> /// <param name="WriteTypeCode">If a type code is to be output.</param> /// <param name="Embedded">If the object is embedded into another.</param> /// <param name="Value">The actual object to serialize.</param> public void Serialize(BinarySerializer Writer, bool WriteTypeCode, bool Embedded, object Value) { throw new NotImplementedException(); // TODO }