Exemple #1
0
        public void WriteValue(IStreamWriter writer, ISerializeContext context, object value)
        {
            // Complex structure
            // TypeID UInt32
            // ContentType Byte
            context.Key = this.Name;
            if (isObject)
            {
                // property or collection does not specify a target type
                // determine object type
                if (value != null)
                {
                    Type valType = value.GetType();

                    IValueItem item;
                    var        differentTargetStructure = context.DetermineSpecialInterfaceType(value.GetType(), type);
                    if (differentTargetStructure != null)
                    {
                        item = differentTargetStructure;
                    }
                    else
                    {
                        item = context.GetByType(valType);
                    }

                    if (!item.IsTypePrefixExpected)
                    {
                        // Write type id for value types as well (unknown structure)
                        writer.WriteUInt32(item.TypeId);

                        writer.WriteUInt8(ValueItem.SingleValueIdent);
                    }

                    item.WriteValue(writer, context, value);
                }
                else
                {
                    // write complex object type id for null value
                    writer.WriteInt32((int)ItemType.ComplexObject);
                    writer.WriteUInt8(ValueItem.NullValueIdent);
                }
            }
            else if (value == null)
            {
                // Write null
                writer.WriteUInt32(this.TypeId);
                writer.WriteUInt8(ValueItem.NullValueIdent);
            }
            else
            {
                IValueItem differentTargetStructure = null;
                if (CheckDifferentType)
                {
                    differentTargetStructure = context.DetermineSpecialInterfaceType(value.GetType(), type);
                }

                if (differentTargetStructure != null)
                {
                    // Special target interface type serialization
                    differentTargetStructure.WriteValue(writer, context, value);
                }
                else
                {
                    // Just write type properties
                    writer.WriteUInt32(this.TypeId);

                    if (context.IsWriteTypeMetaInfoRequired(this.TypeId))
                    {
                        // serialize type meta info at the first time
                        TypeMetaStructure.WriteTypeMetaInfo(writer, this);
                    }

                    writer.WriteUInt8(ValueItem.SingleObjectIdent);

                    object oldParentObj = context.ParentObject;
                    context.ParentObject = value;

                    for (int itemIndex = 0; itemIndex < items.Count; itemIndex++)
                    {
                        var item = items[itemIndex];

                        var valueItem = item.GetItemValue(value);

                        item.WriteValue(writer, context, valueItem);
                    }

                    context.ParentObject = oldParentObj;
                }
            }
        }