예제 #1
0
        public override void OnWrite(ByteObjectWriter writer, object value, Type defaultItemType)
        {
            var structType = value.GetType();
            writer.Type(structType, defaultItemType);

            var rule = ByteUtils.GetRule(structType);
            if (rule != null)
            {
                rule.OnWriteInternal(writer, value);
            }
            else
            {
                var fields = usedFields.GetUnical(structType);
                if (fields == null)
                    fields = ByteUtils.GetSerializeFields(structType);

                writer.Ushort((ushort)fields.Length);
                for (int i = 0; i < fields.Length; i++)
                {
                    var field = fields[i];
                    writer.String(field.Name);
                    writer.Complex(field.GetValue(value), null);
                }
            }
        }
예제 #2
0
        public override void OnWrite(ByteObjectWriter writer, object value, Type defaultItemType)
        {
            //Сохраняем данные в хеше, получаем объект который:
            //Если данные отсутствовали в хеше - возвращает текущую позицию
            //Если данные были в хеше - возвращает позицию, которая была при сохранении
            var objData = writer.SaveToClassHashtable(value);
            if (objData.definitionPosition == writer.position)
            {
                writer.Byte(IsDefinition);

                var classType = value.GetType();
                writer.Type(classType, defaultItemType);

                var rule = ByteUtils.GetRule(classType);
                if (rule != null)
                {
                    rule.OnWriteInternal(writer, value);
                }
                else
                {
                    var fields = usedFields.GetUnical(classType);
                    if (fields == null)
                        fields = ByteUtils.GetSerializeFields(classType);

                    writer.Ushort((ushort)fields.Length);
                    for (int i = 0; i < fields.Length; i++)
                    {
                        var field = fields[i];
                        writer.String(field.Name);
                        writer.Complex(field.GetValue(value), null);
                    }
                }
            }
            else
            {
                writer.Byte(IsGoto);
                writer.Int(objData.definitionPosition);
            }
        }
예제 #3
0
 public override void OnWrite(ByteObjectWriter writer, object value, Type defaultItemType)
 {
     writer.Ushort((ushort)value);
 }