예제 #1
0
        public override void OnDictionaryBegin(SirenTypeId keyDataType, SirenTypeId valueDataType, int count)
        {
            Stream.WriteUInt8((byte)keyDataType);
            Stream.WriteUInt8((byte)valueDataType);

            Stream.WriteVarUInt32((uint)count);
        }
예제 #2
0
        public override void OnDictionaryBegin(out SirenTypeId keyDataType, out SirenTypeId valueDataType,out int count)
        {
            keyDataType = (SirenTypeId)Stream.ReadUInt8();
            valueDataType = (SirenTypeId)Stream.ReadUInt8();

            count = (int)Stream.ReadVarUInt32();
        }
예제 #3
0
        public override void OnDictionaryBegin(out SirenTypeId keyDataType, out SirenTypeId valueDataType, out int count)
        {
            keyDataType   = (SirenTypeId)Stream.ReadUInt8();
            valueDataType = (SirenTypeId)Stream.ReadUInt8();

            count = (int)Stream.ReadVarUInt32();
        }
예제 #4
0
 public override void OnFieldBegin(string name, ushort id, SirenTypeId dataType)
 {
     if (id <= 5)
     {
         Stream.WriteUInt8((byte)((uint)dataType | ((uint)id << 5)));
     }
     else if (id <= 0xFF)
     {
         Stream.WriteUInt16((ushort)((uint)dataType | (uint)id << 8 | (0x06 << 5)));
     }
     else
     {
         Stream.WriteUInt8((byte)((uint)dataType | (0x07 << 5)));
         Stream.WriteUInt16(id);
     }
 }
예제 #5
0
        public override int OnFieldBegin(string name, ushort id, SirenTypeId dataType, out ushort outId, out SirenTypeId outDataType)
        {
            if (!mIsPropertyWaiting)
            {
                ushort tempId;
                uint   raw  = Stream.ReadUInt8();
                var    type = (SirenTypeId)(raw & 0x1f);
                raw >>= 5;

                if (raw < 6)
                {
                    tempId = (ushort)raw;
                }
                else if (raw == 6)
                {
                    tempId = Stream.ReadUInt8();
                }
                else
                {
                    tempId = Stream.ReadUInt16();
                }

                mCurrentPropertyId   = tempId;
                mCurrentPropertyType = type;

                mIsPropertyWaiting = true;
            }

            outId       = mCurrentPropertyId;
            outDataType = mCurrentPropertyType;

            if (id == mCurrentPropertyId)
            {
                mIsPropertyWaiting = false;
                return(0);
            }
            else if (id < mCurrentPropertyId)
            {
                return(-1);
            }
            mIsPropertyWaiting = false;
            return(1);
        }
예제 #6
0
        public override int OnFieldBegin(string name, ushort id, SirenTypeId dataType, out ushort outId, out SirenTypeId outDataType)
        {
            if (!mIsPropertyWaiting)
            {
                ushort tempId;
                uint raw = Stream.ReadUInt8();
                var type = (SirenTypeId)(raw & 0x1f);
                raw >>= 5;

                if (raw < 6)
                {
                    tempId = (ushort)raw;
                }
                else if (raw == 6)
                {
                    tempId = Stream.ReadUInt8();
                }
                else
                {
                    tempId = Stream.ReadUInt16();
                }

                mCurrentPropertyId = tempId;
                mCurrentPropertyType = type;

                mIsPropertyWaiting = true;
            }

            outId = mCurrentPropertyId;
            outDataType = mCurrentPropertyType;

            if (id == mCurrentPropertyId)
            {
                mIsPropertyWaiting = false;
                return 0;
            }
            else if (id < mCurrentPropertyId)
            {
                return -1;
            }
            mIsPropertyWaiting = false;
            return 1;
        }
예제 #7
0
 public override void OnListBegin(SirenTypeId itemDataType, int count)
 {
     Stream.WriteUInt8((byte)itemDataType);
     Stream.WriteVarUInt32((uint)count);
 }
예제 #8
0
 public SirenField(ushort id, SirenTypeId type)
 {
     Id       = id;
     DataType = type;
 }
예제 #9
0
 public abstract void OnDictionaryBegin(SirenTypeId keyDataType, SirenTypeId valueDataType, int count);
예제 #10
0
 public override void OnListBegin(out SirenTypeId dataType, out int count)
 {
     dataType = (SirenTypeId)Stream.ReadUInt8();
     count    = (int)Stream.ReadVarUInt32();
 }
예제 #11
0
 public override void OnListBegin(out SirenTypeId dataType,out int count)
 {
     dataType = (SirenTypeId)Stream.ReadUInt8();
     count = (int)Stream.ReadVarUInt32();
 }
예제 #12
0
 public override void OnFieldSkip(SirenTypeId dataType)
 {
     SkipPropertyHelper(dataType);
 }
예제 #13
0
        void SkipPropertyHelper(SirenTypeId type)
        {
            switch (type)
            {
            case SirenTypeId.Bool:
                Stream.SkipBytes(sizeof(byte));
                break;
            case SirenTypeId.Int8:
            case SirenTypeId.UInt8:
                Stream.SkipBytes(sizeof(byte));
                break;
            case SirenTypeId.Int16:
            case SirenTypeId.UInt16:
                Stream.ReadVarUInt16();
                break;
            case SirenTypeId.Int32:
            case SirenTypeId.UInt32:
                Stream.ReadVarUInt32();
                break;
            case SirenTypeId.Int64:
            case SirenTypeId.UInt64:
                Stream.ReadVarUInt64();
                break;
            case SirenTypeId.Float:
                Stream.SkipBytes(sizeof(float));
                break;
            case SirenTypeId.Double:
                Stream.SkipBytes(sizeof(double));
                break;
            case SirenTypeId.String:
            {
                uint length= Stream.ReadVarUInt32();
                Stream.SkipBytes((int)length);
            }
            break;
            case SirenTypeId.Blob:
            {
                uint length= Stream.ReadVarUInt32();
                Stream.SkipBytes((int)length);
            }
            break;

            case SirenTypeId.Struct:
                SkipProperty();
                break;
            case SirenTypeId.List:
            {
                SirenTypeId valueType=(SirenTypeId)Stream.ReadUInt8();
                uint count= Stream.ReadVarUInt32();
                for (int i = 0; i < count; i++)
                {
                    SkipPropertyHelper(valueType);
                }
            }
            break;
            case SirenTypeId.Dictionary:
            {
                SirenTypeId keyType=(SirenTypeId)Stream.ReadUInt8();
                SirenTypeId valueType=(SirenTypeId)Stream.ReadUInt8();
                uint count= Stream.ReadVarUInt32();
                for (int i = 0; i < count; i++)
                {
                    SkipPropertyHelper(keyType);
                    SkipPropertyHelper(valueType);

                }
            }
            break;
            }
        }
예제 #14
0
        public SirenField(SirenCustomClass parentSirenClass, PropertyInfo info, SirenFieldAttribute attribute, uint index, ushort id)
        {
            ParentType = parentSirenClass;
            Info       = info;
            Name       = Info.Name;
            Id         = id;
            Attribute  = attribute;
            Index      = index;
            FieldType  = SirenPropertyFieldType.Struct;
            Type       = SirenMachine.GetType(info.PropertyType);
            DataType   = SirenMachine.GetTypeId(Type.Type);

            if (Type.Type.IsGenericType)
            {
                if (Type.Name.StartsWith("List"))
                {
                    FieldType = SirenPropertyFieldType.List;

                    var valueType = Type.Type.GetGenericArguments()[0];
                    ValueType = SirenMachine.GetType(valueType);
                }
                else if (Type.Name.StartsWith("Dictionary"))
                {
                    FieldType = SirenPropertyFieldType.Dictionary;

                    var keyType   = Type.Type.GetGenericArguments()[0];
                    var valueType = Type.Type.GetGenericArguments()[1];
                    KeyType   = SirenMachine.GetType(keyType);
                    ValueType = SirenMachine.GetType(valueType);
                }
                else
                {
                    throw  new Exception("Invalid siren field");
                }

                DefaultValueString = String.Empty;
            }
            else
            {
                if (Type.Type.IsPrimitive || Type.Type == typeof(string) || Type.Type == typeof(byte[]))
                {
                    if (Type.Type == typeof(string))
                    {
                        FieldType = SirenPropertyFieldType.String;
                    }
                    else if (Type.Type == typeof(byte[]))
                    {
                        FieldType = SirenPropertyFieldType.Blob;
                    }
                    else
                    {
                        FieldType = SirenPropertyFieldType.Value;
                    }
                }
                else
                {
                    FieldType = SirenPropertyFieldType.Struct;
                    ValueType = SirenMachine.GetType(Type.Type);
                }

                DefaultValueString = String.Empty;
                if (Type.Type.IsValueType)
                {
                    if (Attribute.DefaultValue != null)
                    {
                        if (Type.Type.IsEnum)
                        {
                            DefaultValueString = String.Format("({0}){1}", Type.Name, Convert.ToUInt32(Attribute.DefaultValue));
                        }
                        else
                        {
                            DefaultValueString = Attribute.DefaultValue.ToString();
                        }
                    }
                    //else
                    //{
                    //    if (Type.Type == typeof(bool))
                    //    {
                    //        DefaultValueString = "false";
                    //    }
                    //    else if (Type.Type == typeof(float))
                    //    {
                    //        DefaultValueString = "0.f";
                    //    }
                    //    else if (Type.Type == typeof(double))
                    //    {
                    //        DefaultValueString = "0.0";
                    //    }
                    //    else
                    //    {
                    //        if (Type.Type.IsEnum)
                    //        {
                    //            DefaultValueString = String.Format("({0})0", Type.Name);
                    //        }
                    //        else
                    //        {
                    //            DefaultValueString = "0";
                    //        }
                    //    }
                    //}
                }
            }
        }
예제 #15
0
 public override void OnFieldSkip(SirenTypeId dataType)
 {
     SkipPropertyHelper(dataType);
 }
예제 #16
0
        void SkipPropertyHelper(SirenTypeId type)
        {
            switch (type)
            {
            case SirenTypeId.Bool:
                Stream.SkipBytes(sizeof(byte));
                break;

            case SirenTypeId.Int8:
            case SirenTypeId.UInt8:
                Stream.SkipBytes(sizeof(byte));
                break;

            case SirenTypeId.Int16:
            case SirenTypeId.UInt16:
                Stream.ReadVarUInt16();
                break;

            case SirenTypeId.Int32:
            case SirenTypeId.UInt32:
                Stream.ReadVarUInt32();
                break;

            case SirenTypeId.Int64:
            case SirenTypeId.UInt64:
                Stream.ReadVarUInt64();
                break;

            case SirenTypeId.Float:
                Stream.SkipBytes(sizeof(float));
                break;

            case SirenTypeId.Double:
                Stream.SkipBytes(sizeof(double));
                break;

            case SirenTypeId.String:
            {
                uint length = Stream.ReadVarUInt32();
                Stream.SkipBytes((int)length);
            }
            break;

            case SirenTypeId.Blob:
            {
                uint length = Stream.ReadVarUInt32();
                Stream.SkipBytes((int)length);
            }
            break;

            case SirenTypeId.Struct:
                SkipProperty();
                break;

            case SirenTypeId.List:
            {
                SirenTypeId valueType = (SirenTypeId)Stream.ReadUInt8();
                uint        count     = Stream.ReadVarUInt32();
                for (int i = 0; i < count; i++)
                {
                    SkipPropertyHelper(valueType);
                }
            }
            break;

            case SirenTypeId.Dictionary:
            {
                SirenTypeId keyType   = (SirenTypeId)Stream.ReadUInt8();
                SirenTypeId valueType = (SirenTypeId)Stream.ReadUInt8();
                uint        count     = Stream.ReadVarUInt32();
                for (int i = 0; i < count; i++)
                {
                    SkipPropertyHelper(keyType);
                    SkipPropertyHelper(valueType);
                }
            }
            break;
            }
        }
예제 #17
0
 public abstract void OnListBegin(out SirenTypeId dataType, out int count);
예제 #18
0
 public abstract int OnFieldBegin(string name, ushort id, SirenTypeId dataType, out ushort outId, out SirenTypeId outDataType);
예제 #19
0
 public abstract void OnFieldSkip(SirenTypeId dataType);
예제 #20
0
 public abstract void OnListBegin(SirenTypeId itemDataType, int count);
예제 #21
0
        public void SerializeBase(object obj, SirenCustomClass sirenClass)
        {
            if (sirenClass.BaseType != null)
            {
                SerializeBase(obj, sirenClass.BaseType);
            }

            foreach (var sirenField in sirenClass.Fields)
            {
                if (sirenField.Attribute.Mode != SirenFieldGenerateMode.Optional)
                {
                    if (!sirenField.HasValue(obj))
                    {
                        Logger.ErrorLine("Forget to set {0}.{1}", sirenClass.Name, sirenField.Name);
                        Writer.OnError();
                        return;
                    }
                }
                else
                {
                    if (!sirenField.HasValue(obj))
                    {
                        //skip
                        return;
                    }
                }

                Writer.OnFieldBegin(sirenField.Name, sirenField.Id, sirenField.DataType);

                switch (sirenField.FieldType)
                {
                case SirenPropertyFieldType.Value:
                    Writer.OnValue(sirenField.Info.GetValue(obj, null));
                    break;

                case SirenPropertyFieldType.String:
                    Writer.OnString(sirenField.Info.GetValue(obj, null) as string);
                    break;

                case SirenPropertyFieldType.Blob:
                    Writer.OnMemoryData(sirenField.Info.GetValue(obj, null) as byte[]);
                    break;

                case SirenPropertyFieldType.List:
                {
                    object items    = sirenField.Info.GetValue(obj, null);
                    var    listType = sirenField.Type;
                    int    count    = Convert.ToInt32(listType.Type.GetProperty("Count").GetValue(items, null));

                    var         itemType     = sirenField.Type.Type.GetGenericArguments()[0];
                    SirenTypeId itemDataType = SirenMachine.GetTypeId(itemType);
                    Writer.OnListBegin(itemDataType, count);
                    var itemsProperty = listType.Type.GetProperty("Item");
                    for (int i = 0; i < count; i++)
                    {
                        object listItem = itemsProperty.GetValue(items, new object[] { i });
                        SerializeHelper(listItem, sirenField.ValueType);
                    }
                    Writer.OnListEnd();
                }

                break;

                case SirenPropertyFieldType.Dictionary:
                {
                    object items    = sirenField.Info.GetValue(obj, null);
                    var    dictType = sirenField.Type;
                    int    count    = Convert.ToInt32(dictType.Type.GetProperty("Count").GetValue(items, null));

                    var keyType   = sirenField.Type.Type.GetGenericArguments()[0];
                    var valueType = sirenField.Type.Type.GetGenericArguments()[1];

                    SirenTypeId keyDataType   = SirenMachine.GetTypeId(keyType);
                    SirenTypeId valueDataType = SirenMachine.GetTypeId(valueType);


                    Writer.OnDictionaryBegin(keyDataType, valueDataType, count);

                    foreach (var o in (items as IEnumerable))
                    {
                        var itemKey = o.GetType().GetProperty("Key").GetValue(o, null);
                        SerializeHelper(itemKey, sirenField.KeyType);
                        var itemValue = o.GetType().GetProperty("Value").GetValue(o, null);
                        SerializeHelper(itemValue, sirenField.ValueType);
                    }

                    Writer.OnDictionaryEnd();
                }
                break;

                case SirenPropertyFieldType.Struct:
                {
                    object val = sirenField.Info.GetValue(obj, null);
                    SerializeHelper(val, sirenField.ValueType);
                }

                break;
                }

                Writer.OnFieldEnd();
            }
        }
예제 #22
0
 public abstract void OnFieldBegin(string name, ushort id, SirenTypeId dataType);
예제 #23
0
파일: SirenField.cs 프로젝트: fjz13/Medusa
 public SirenField(ushort id, SirenTypeId type)
 {
     Id = id;
     DataType = type;
 }