private void CacheInsert(Type type, BoisMemberInfo memInfo) { lock (_cache) { if (!_cache.ContainsKey(type)) { _cache.Add(type, memInfo); } } }
void WriteValue(BinaryWriter writer, object value, BoisMemberInfo bionType) { if (!bionType.IsSupportedPrimitive) { if (value == null) { WriteNullableType(writer, true); return; } } WriteValue(writer, bionType, value); }
private void WriteObject(BinaryWriter writer, BoisMemberInfo boisMemInfo, object obj) { if (obj == null) { // null indicator WriteNullableType(writer, true); return; } var type = obj.GetType(); var boisType = _typeCache.GetTypeInfo(type, true); var boisTypeInfo = boisType as BoisTypeInfo; _serializeDepth++; // Use this member info if avaiable. it is more accurate because it came from the object holder, // not the object itseld. if (boisMemInfo.IsContainerObject && boisMemInfo.IsNullable) { //This is a nullable struct and is not null WriteNullableType(writer, false); } if (boisTypeInfo != null) { // writing the members for (int i = 0; i < boisTypeInfo.Members.Length; i++) { var mem = boisTypeInfo.Members[i]; if (mem.MemberType == EnBoisMemberType.Property) { var value = mem.PropertyGetter(obj); WriteValue(writer, mem, value); } else if (mem.MemberType == EnBoisMemberType.Field) { var finfo = (FieldInfo)mem.Info; var value = finfo.GetValue(obj); WriteValue(writer, mem, value); } } } _serializeDepth--; }
private bool TryReadNumber__Nullable(Type memType, out BoisMemberInfo output) { if (memType.IsClass) { output = null; return(false); } if (memType == typeof(int) || memType == typeof(int?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Int32, IsSupportedPrimitive = true, }; } else if (memType == typeof(long) || memType == typeof(long?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Int64, IsSupportedPrimitive = true, }; } else if (memType == typeof(short) || memType == typeof(short?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Int16, IsSupportedPrimitive = true, }; } else if (memType == typeof(double) || memType == typeof(double?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Double, }; } else if (memType == typeof(decimal) || memType == typeof(decimal?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Decimal, }; } else if (memType == typeof(float) || memType == typeof(float?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Single, }; } else if (memType == typeof(byte) || memType == typeof(byte?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.Byte, }; } else if (memType == typeof(sbyte) || memType == typeof(sbyte?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.SByte, }; } else if (memType == typeof(ushort) || memType == typeof(ushort?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.UInt16, }; } else if (memType == typeof(uint) || memType == typeof(uint?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.UInt32, }; } else if (memType == typeof(ulong) || memType == typeof(ulong?)) { output = new BoisMemberInfo { KnownType = EnBoisKnownType.UInt64, }; } else { output = null; return(false); } return(true); }
/// <summary> /// Slower convertion /// </summary> private bool IsNumber(Type memType, out BoisMemberInfo output) { if (memType.IsClass) { output = null; return(false); } output = null; switch (Type.GetTypeCode(UnNullify(memType))) { case TypeCode.Int16: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Int16, IsSupportedPrimitive = true, }; break; case TypeCode.Int32: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Int32, IsSupportedPrimitive = true, }; break; case TypeCode.Int64: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Int64, IsSupportedPrimitive = true, }; break; case TypeCode.Single: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Single }; break; case TypeCode.Double: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Double }; break; case TypeCode.Decimal: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Decimal }; break; case TypeCode.Byte: output = new BoisMemberInfo { KnownType = EnBoisKnownType.Byte }; break; case TypeCode.SByte: output = new BoisMemberInfo { KnownType = EnBoisKnownType.SByte }; break; case TypeCode.UInt16: output = new BoisMemberInfo { KnownType = EnBoisKnownType.UInt16 }; break; case TypeCode.UInt32: output = new BoisMemberInfo { KnownType = EnBoisKnownType.UInt32 }; break; case TypeCode.UInt64: output = new BoisMemberInfo { KnownType = EnBoisKnownType.UInt64 }; break; } return(output != null); }
private object ReadMember(BinaryReader reader, BoisMemberInfo memInfo, Type memType) { if ((memInfo.IsNullable && memInfo.IsContainerObject) || (memInfo.IsNullable && !memInfo.IsSupportedPrimitive && (!memInfo.IsContainerObject || memInfo.IsStruct))) { bool isNull = reader.ReadByte() != 0; if (isNull) { return(null); } } var actualMemberType = memType; if (memInfo.IsNullable && memInfo.NullableUnderlyingType != null) { actualMemberType = memInfo.NullableUnderlyingType; } switch (memInfo.KnownType) { case EnBoisKnownType.Unknown: if (memInfo.IsContainerObject) { return(ReadObject(reader, actualMemberType)); } else if (memInfo.IsStringDictionary) { return(ReadStringDictionary(reader, actualMemberType)); } else if (memInfo.IsDictionary) { return(ReadDictionary(reader, actualMemberType)); } else if (memInfo.IsCollection) { if (memInfo.IsGeneric) { return(ReadGenericList(reader, actualMemberType)); } return(ReadArray(reader, actualMemberType)); } else if (memInfo.IsArray) { return(ReadArray(reader, actualMemberType)); } break; case EnBoisKnownType.Int16: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarInt16Nullable(reader)); } return(PrimitivesConvertion.ReadVarInt16(reader)); case EnBoisKnownType.UInt16: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarUInt16Nullable(reader)); } return(PrimitivesConvertion.ReadVarUInt16(reader)); case EnBoisKnownType.Int32: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarInt32Nullable(reader)); } return(PrimitivesConvertion.ReadVarInt32(reader)); case EnBoisKnownType.Int64: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarInt64Nullable(reader)); } return(PrimitivesConvertion.ReadVarInt64(reader)); case EnBoisKnownType.UInt64: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarUInt64Nullable(reader)); } return(PrimitivesConvertion.ReadVarUInt64(reader)); case EnBoisKnownType.UInt32: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarUInt32Nullable(reader)); } return(PrimitivesConvertion.ReadVarUInt32(reader)); case EnBoisKnownType.Double: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarDoubleNullable(reader)); } return(PrimitivesConvertion.ReadVarDouble(reader)); case EnBoisKnownType.Decimal: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarDecimalNullable(reader)); } return(PrimitivesConvertion.ReadVarDecimal(reader)); case EnBoisKnownType.Single: if (memInfo.IsNullable) { return(PrimitivesConvertion.ReadVarSingleNullable(reader)); } return(PrimitivesConvertion.ReadVarSingle(reader)); case EnBoisKnownType.Byte: return(reader.ReadByte()); case EnBoisKnownType.SByte: return(reader.ReadSByte()); case EnBoisKnownType.ByteArray: return(ReadBytes(reader)); case EnBoisKnownType.String: return(ReadString(reader)); case EnBoisKnownType.Char: var charByte = reader.ReadUInt16(); return((char)charByte); case EnBoisKnownType.Bool: return(ReadBoolean(reader)); case EnBoisKnownType.Enum: return(ReadEnum(reader, actualMemberType)); case EnBoisKnownType.DateTime: return(ReadDateTime(reader)); case EnBoisKnownType.DateTimeOffset: return(ReadDateTimeOffset(reader)); case EnBoisKnownType.TimeSpan: return(ReadTimeSpan(reader)); #if !SILVERLIGHT && DotNet case EnBoisKnownType.DataSet: return(ReadDataset(reader, actualMemberType)); case EnBoisKnownType.DataTable: return(ReadDataTable(reader)); #endif #if DotNet || DotNetCore || DotNetStandard case EnBoisKnownType.NameValueColl: return(ReadCollectionNameValue(reader, actualMemberType)); case EnBoisKnownType.Color: return(ReadColor(reader)); case EnBoisKnownType.DbNull: return(DBNull.Value); #endif case EnBoisKnownType.Version: return(ReadVersion(reader)); case EnBoisKnownType.Guid: return(ReadGuid(reader)); case EnBoisKnownType.Uri: return(ReadUri(reader)); default: throw new ArgumentOutOfRangeException(); } return(null); }
void WriteValue(BinaryWriter writer, BoisMemberInfo boisMemInfo, object value) { if (!boisMemInfo.IsSupportedPrimitive && !boisMemInfo.IsContainerObject) { if (value == null) { WriteNullableType(writer, true); return; } else if (boisMemInfo.IsNullable) { WriteNullableType(writer, false); } } switch (boisMemInfo.KnownType) { case EnBoisKnownType.Unknown: if (boisMemInfo.IsContainerObject) { WriteObject(writer, boisMemInfo, value); } else if (boisMemInfo.IsStringDictionary) { WriteStringDictionary(writer, value as IDictionary); } else if (boisMemInfo.IsDictionary) { WriteDictionary(writer, value as IDictionary); } else if (boisMemInfo.IsCollection || boisMemInfo.IsArray) { if (boisMemInfo.IsGeneric) { WriteGenericList(writer, value as IEnumerable); } else { WriteArray(writer, value); } } break; case EnBoisKnownType.Int16: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (short?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (short)value); } break; case EnBoisKnownType.UInt16: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (ushort?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (ushort)value); } break; case EnBoisKnownType.Int32: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (int?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (int)value); } break; case EnBoisKnownType.Int64: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (long?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (long)value); } break; case EnBoisKnownType.UInt64: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (ulong?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (ulong)value); } break; case EnBoisKnownType.UInt32: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (uint?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (uint)value); } break; case EnBoisKnownType.Double: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarDecimal(writer, (double?)value); } else { PrimitivesConvertion.WriteVarDecimal(writer, (double)value); } break; case EnBoisKnownType.Decimal: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarDecimal(writer, (decimal?)value); } else { PrimitivesConvertion.WriteVarDecimal(writer, (decimal)value); } break; case EnBoisKnownType.Single: if (value == null || boisMemInfo.IsNullable) { PrimitivesConvertion.WriteVarDecimal(writer, (float?)value); } else { PrimitivesConvertion.WriteVarDecimal(writer, (float)value); } break; case EnBoisKnownType.Byte: writer.Write((byte)value); break; case EnBoisKnownType.SByte: writer.Write((sbyte)value); break; case EnBoisKnownType.ByteArray: WriteBytes(writer, (byte[])value); break; case EnBoisKnownType.String: WriteString(writer, value as string); break; case EnBoisKnownType.Char: writer.Write((ushort)((char)value)); break; case EnBoisKnownType.Bool: writer.Write((byte)(((bool)value) ? 1 : 0)); break; case EnBoisKnownType.Enum: WriteEnum(writer, (Enum)value); break; case EnBoisKnownType.DateTime: WriteDateTime(writer, (DateTime)value); break; case EnBoisKnownType.DateTimeOffset: WriteDateTimeOffset(writer, (DateTimeOffset)value); break; case EnBoisKnownType.TimeSpan: WriteTimeSpan(writer, (TimeSpan)value); break; #if !SILVERLIGHT && DotNet case EnBoisKnownType.DataSet: WriteDataset(writer, value as DataSet); break; case EnBoisKnownType.DataTable: WriteDataTable(writer, value as DataTable); break; #endif #if DotNet || DotNetCore || DotNetStandard case EnBoisKnownType.NameValueColl: WriteCollectionNameValue(writer, value as NameValueCollection); break; case EnBoisKnownType.Color: WriteColor(writer, (Color)value); break; #endif case EnBoisKnownType.Version: WriteVersion(writer, value as Version); break; case EnBoisKnownType.DbNull: // Do not write anything, it is already written as Nullable object. //WriteNullableType(true); break; case EnBoisKnownType.Guid: WriteGuid(writer, (Guid)value); break; case EnBoisKnownType.Uri: WriteUri(writer, value as Uri); break; default: throw new ArgumentOutOfRangeException(); } }