示例#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 itemType = value.GetType().GetElementType();
            var array = ((Array)value);

            writer.Type(itemType, defaultItemType);
            writer.Int(array.Length);
            for (int i = 0; i < array.Length; i++)
                writer.Complex(array.GetValue(i), itemType);
        }
示例#3
0
 private void DimensionalWriteResoursy(ByteObjectWriter writer, Array array, Type itemType, int dimensional, int[] indexes)
 {
     for (int i = 0; i < array.GetLength(dimensional); i++)
     {
         indexes[dimensional] = i;
         if (dimensional < array.Rank - 1)
             DimensionalWriteResoursy(writer, array, itemType, dimensional + 1, indexes);
         else
         {
             writer.Complex(array.GetValue(indexes), itemType);
         }
     }
 }
示例#4
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);
            }
        }