Example #1
0
 private void CacheInsert(Type type, BoisMemberInfo memInfo)
 {
     lock (_cache)
     {
         if (!_cache.ContainsKey(type))
         {
             _cache.Add(type, memInfo);
         }
     }
 }
Example #2
0
 void WriteValue(BinaryWriter writer, object value, BoisMemberInfo bionType)
 {
     if (!bionType.IsSupportedPrimitive)
     {
         if (value == null)
         {
             WriteNullableType(writer, true);
             return;
         }
     }
     WriteValue(writer, bionType, value);
 }
Example #3
0
        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--;
        }
Example #4
0
 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);
 }
Example #5
0
        /// <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);
        }
Example #6
0
        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);
        }
Example #7
0
        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();
            }
        }