예제 #1
0
        private void WriteGenericList(BinaryWriter writer, IEnumerable array)
        {
            int count = 0;
            var col   = array as ICollection;

            if (col != null)
            {
                count = (int)col.Count;
            }
            else
            {
                foreach (object obj in array)
                {
                    count++;
                }
            }
            var itemType = GetBoisMemberInfo(array.GetType().GetGenericArguments()[0]);

            // Int32
            PrimitivesConvertion.WriteVarInt(writer, count);
            foreach (object obj in array)
            {
                WriteValue(writer, obj, itemType);
            }
        }
예제 #2
0
        private void WriteDataRow(BinaryWriter writer, DataRow row, int columnCount)
        {
            var values = new Dictionary <int, object>();

            for (int i = 0; i < columnCount; i++)
            {
                var val = row[i];
                if (val != null && !Convert.IsDBNull(val))
                {
                    values.Add(i, val);
                }
            }

            // count of non-null columns
            // Int32
            PrimitivesConvertion.WriteVarInt(writer, values.Count);

            foreach (var value in values)
            {
                // Int32
                PrimitivesConvertion.WriteVarInt(writer, value.Key);

                WriteValue(writer, value.Value);
            }
        }
예제 #3
0
        private void WriteColor(BinaryWriter writer, Color c)
        {
            int argb = c.ToArgb();

            // Int32
            PrimitivesConvertion.WriteVarInt(writer, argb);
        }
예제 #4
0
        private void WriteDataset(BinaryWriter writer, DataSet ds)
        {
            // Int32
            PrimitivesConvertion.WriteVarInt(writer, ds.Tables.Count);

            foreach (DataTable table in ds.Tables)
            {
                WriteDataTable(writer, table);
            }
        }
예제 #5
0
        private void WriteCollectionNameValue(BinaryWriter writer, NameValueCollection nameValue)
        {
            // Int32
            PrimitivesConvertion.WriteVarInt(writer, nameValue.Count);

            foreach (string key in nameValue)
            {
                WriteValue(writer, key);
                WriteValue(writer, nameValue[key]);
            }
        }
예제 #6
0
        private void WriteStringDictionary(BinaryWriter writer, IDictionary dic)
        {
            // Int32
            PrimitivesConvertion.WriteVarInt(writer, dic.Count);

            var genericType = dic.GetType().GetGenericArguments();
            var keyType     = GetBoisMemberInfo(typeof(string));
            var valType     = GetBoisMemberInfo(genericType[1]);

            foreach (DictionaryEntry entry in dic)
            {
                WriteValue(writer, entry.Key.ToString(), keyType);
                WriteValue(writer, entry.Value, valType);
            }
        }
예제 #7
0
        private void WriteGuid(BinaryWriter writer, Guid g)
        {
            if (g == Guid.Empty)
            {
                // Int32
                PrimitivesConvertion.WriteVarInt(writer, 0);
                return;
            }

            var data = g.ToByteArray();

            // Int32
            PrimitivesConvertion.WriteVarInt(writer, data.Length);
            writer.Write(data);
        }
예제 #8
0
        private void WriteDateTimeOffset(BinaryWriter writer, DateTimeOffset dateTimeOffset)
        {
            var   dt     = dateTimeOffset;
            var   offset = dateTimeOffset.Offset;
            short offsetMinutes;

            unchecked
            {
                offsetMinutes = (short)((offset.Hours * 60) + offset.Minutes);
            }
            // int16
            PrimitivesConvertion.WriteVarInt(writer, offsetMinutes);

            // int64
            PrimitivesConvertion.WriteVarInt(writer, dt.Ticks);
        }
예제 #9
0
 private void WriteString(BinaryWriter writer, string str)
 {
     if (str == null)
     {
         PrimitivesConvertion.WriteVarInt(writer, (int?)null);
     }
     else if (str.Length == 0)
     {
         PrimitivesConvertion.WriteVarInt(writer, (int?)0);
     }
     else
     {
         var strBytes = Encoding.GetBytes(str);
         // Int32
         PrimitivesConvertion.WriteVarInt(writer, (int?)strBytes.Length);
         writer.Write(strBytes);
     }
 }
예제 #10
0
        private void WriteDataTable(BinaryWriter writer, DataTable table)
        {
            if (string.IsNullOrEmpty(table.TableName))
            {
                table.TableName = "tbl_" + DateTime.Now.Ticks.GetHashCode().ToString();
            }
            WriteString(writer, GetXmlSchema(table));

            // Int32
            PrimitivesConvertion.WriteVarInt(writer, table.Rows.Count);

            var colsCount = table.Columns.Count;

            foreach (DataRow row in table.Rows)
            {
                WriteDataRow(writer, row, colsCount);
            }
        }
예제 #11
0
        private void WriteArray(BinaryWriter writer, object array)
        {
            var arr = array as Array;

            if (arr == null)
            {
                var enumurable = (IEnumerable)array;

                int count = 0;
                var col   = array as ICollection;
                if (col != null)
                {
                    count = (int)col.Count;
                }
                else
                {
                    foreach (object obj in enumurable)
                    {
                        count++;
                    }
                }

                // Int32
                PrimitivesConvertion.WriteVarInt(writer, count);
                foreach (object obj in enumurable)
                {
                    WriteValue(writer, obj);
                }
            }
            else
            {
                // Int32
                PrimitivesConvertion.WriteVarInt(writer, arr.Length);

                var type     = ReflectionHelper.FindUnderlyingArrayElementType(arr.GetType());
                var bionType = _typeCache.GetTypeInfo(type, true);
                for (int i = 0; i < arr.Length; i++)
                {
                    WriteValue(writer, arr.GetValue(i), bionType);
                }
            }
        }
예제 #12
0
        private void WriteDictionary(BinaryWriter writer, IDictionary dic)
        {
            // Int32
            PrimitivesConvertion.WriteVarInt(writer, dic.Count);

            var theType      = dic.GetType();
            var genericTypes = ReflectionHelper.FindUnderlyingGenericDictionaryElementType(theType);

            if (genericTypes == null)
            {
                var dictionaryType = ReflectionHelper.FindUnderlyingGenericElementType(theType);
                genericTypes = dictionaryType.GetGenericArguments();
            }

            var keyType = GetBoisMemberInfo(genericTypes[0]);
            var valType = GetBoisMemberInfo(genericTypes[1]);

            foreach (DictionaryEntry entry in dic)
            {
                WriteValue(writer, entry.Key, keyType);
                WriteValue(writer, entry.Value, valType);
            }
        }
예제 #13
0
        private void WriteDateTime(BinaryWriter writer, DateTime dateTime)
        {
            var dt   = dateTime;
            var kind = (byte)dt.Kind;

            if (dateTime == DateTime.MinValue)
            {
                writer.Write(kind);
                // min datetime indicator
                PrimitivesConvertion.WriteVarInt(writer, 0L);
            }
            else if (dateTime == DateTime.MaxValue)
            {
                writer.Write(kind);
                // max datetime indicator
                PrimitivesConvertion.WriteVarInt(writer, 1L);
            }
            else
            {
                writer.Write(kind);
                //Int64
                PrimitivesConvertion.WriteVarInt(writer, dt.Ticks);
            }
        }
예제 #14
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();
            }
        }
예제 #15
0
 private void WriteEnum(BinaryWriter writer, Enum e)
 {
     // Int32
     PrimitivesConvertion.WriteVarInt(writer, (int)((object)e));
 }
예제 #16
0
 private void WriteTimeSpan(BinaryWriter writer, TimeSpan timeSpan)
 {
     // Int64
     PrimitivesConvertion.WriteVarInt(writer, timeSpan.Ticks);
 }
예제 #17
0
 private void WriteBytes(BinaryWriter writer, byte[] bytes)
 {
     // Int32
     PrimitivesConvertion.WriteVarInt(writer, bytes.Length);
     writer.Write(bytes);
 }