public override void OnDictionaryBegin(SirenTypeId keyDataType, SirenTypeId valueDataType, int count) { Stream.WriteUInt8((byte)keyDataType); Stream.WriteUInt8((byte)valueDataType); Stream.WriteVarUInt32((uint)count); }
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(); }
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(); }
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); } }
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); }
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; }
public override void OnListBegin(SirenTypeId itemDataType, int count) { Stream.WriteUInt8((byte)itemDataType); Stream.WriteVarUInt32((uint)count); }
public SirenField(ushort id, SirenTypeId type) { Id = id; DataType = type; }
public abstract void OnDictionaryBegin(SirenTypeId keyDataType, SirenTypeId valueDataType, int count);
public override void OnListBegin(out SirenTypeId dataType, out int count) { dataType = (SirenTypeId)Stream.ReadUInt8(); count = (int)Stream.ReadVarUInt32(); }
public override void OnListBegin(out SirenTypeId dataType,out int count) { dataType = (SirenTypeId)Stream.ReadUInt8(); count = (int)Stream.ReadVarUInt32(); }
public override void OnFieldSkip(SirenTypeId dataType) { SkipPropertyHelper(dataType); }
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; } }
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"; // } // } //} } } }
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; } }
public abstract void OnListBegin(out SirenTypeId dataType, out int count);
public abstract int OnFieldBegin(string name, ushort id, SirenTypeId dataType, out ushort outId, out SirenTypeId outDataType);
public abstract void OnFieldSkip(SirenTypeId dataType);
public abstract void OnListBegin(SirenTypeId itemDataType, int count);
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(); } }
public abstract void OnFieldBegin(string name, ushort id, SirenTypeId dataType);