Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
 /// <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
 }