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 = GetMemberInfo(array.GetType().GetGenericArguments()[0]); // Int32 PrimitivesConvertion.WriteVarInt(writer, count); foreach (object obj in array) { WriteValue(writer, obj, itemType); } }
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); } }
private void WriteColor(BinaryWriter writer, Color c) { int argb = c.ToArgb(); // Int32 PrimitivesConvertion.WriteVarInt(writer, argb); }
private void WriteDataset(BinaryWriter writer, DataSet ds) { // Int32 PrimitivesConvertion.WriteVarInt(writer, ds.Tables.Count); foreach (DataTable table in ds.Tables) { WriteDataTable(writer, table); } }
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]); } }
private void WriteStringDictionary(BinaryWriter writer, IDictionary dic) { // Int32 PrimitivesConvertion.WriteVarInt(writer, dic.Count); var genericType = dic.GetType().GetGenericArguments(); var keyType = GetMemberInfo(typeof(string)); var valType = GetMemberInfo(genericType[1]); foreach (DictionaryEntry entry in dic) { WriteValue(writer, entry.Key.ToString(), keyType); WriteValue(writer, entry.Value, valType); } }
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); }
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); }
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); } }
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); } }
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); } } }
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 = GetMemberInfo(genericTypes[0]); var valType = GetMemberInfo(genericTypes[1]); foreach (DictionaryEntry entry in dic) { WriteValue(writer, entry.Key, keyType); WriteValue(writer, entry.Value, valType); } }
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); } }
void WriteValue(BinaryWriter writer, MemberInfo itemMemInfo, object value) { if (!itemMemInfo.IsSupportedPrimitive && !itemMemInfo.IsContainerObject) { if (value == null) { WriteNullableType(writer, true); return; } else if (itemMemInfo.IsNullable) { WriteNullableType(writer, false); } } switch (itemMemInfo.KnownType) { case EnKnownType.Unknown: if (itemMemInfo.IsContainerObject) { WriteObject(writer, itemMemInfo, value); } else if (itemMemInfo.IsStringDictionary) { WriteStringDictionary(writer, value as IDictionary); } else if (itemMemInfo.IsDictionary) { WriteDictionary(writer, value as IDictionary); } else if (itemMemInfo.IsCollection || itemMemInfo.IsArray) { if (itemMemInfo.IsGeneric) { WriteGenericList(writer, value as IEnumerable); } else { WriteArray(writer, value); } } break; case EnKnownType.Int16: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (short?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (short)value); } break; case EnKnownType.UInt16: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (ushort?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (ushort)value); } break; case EnKnownType.Int32: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (int?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (int)value); } break; case EnKnownType.Int64: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (long?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (long)value); } break; case EnKnownType.UInt64: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (ulong?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (ulong)value); } break; case EnKnownType.UInt32: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarInt(writer, (uint?)value); } else { PrimitivesConvertion.WriteVarInt(writer, (uint)value); } break; case EnKnownType.Double: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarDecimal(writer, (double?)value); } else { PrimitivesConvertion.WriteVarDecimal(writer, (double)value); } break; case EnKnownType.Decimal: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarDecimal(writer, (decimal?)value); } else { PrimitivesConvertion.WriteVarDecimal(writer, (decimal)value); } break; case EnKnownType.Single: if (value == null || itemMemInfo.IsNullable) { PrimitivesConvertion.WriteVarDecimal(writer, (float?)value); } else { PrimitivesConvertion.WriteVarDecimal(writer, (float)value); } break; case EnKnownType.Byte: writer.Write((byte)value); break; case EnKnownType.SByte: writer.Write((sbyte)value); break; case EnKnownType.ByteArray: WriteBytes(writer, (byte[])value); break; case EnKnownType.String: WriteString(writer, value as string); break; case EnKnownType.Char: writer.Write((ushort)((char)value)); break; case EnKnownType.Bool: writer.Write((byte)(((bool)value) ? 1 : 0)); break; case EnKnownType.Enum: WriteEnum(writer, (Enum)value); break; case EnKnownType.DateTime: WriteDateTime(writer, (DateTime)value); break; case EnKnownType.DateTimeOffset: WriteDateTimeOffset(writer, (DateTimeOffset)value); break; case EnKnownType.TimeSpan: WriteTimeSpan(writer, (TimeSpan)value); break; case EnKnownType.DataSet: WriteDataset(writer, value as DataSet); break; case EnKnownType.DataTable: WriteDataTable(writer, value as DataTable); break; case EnKnownType.NameValueColl: WriteCollectionNameValue(writer, value as NameValueCollection); break; case EnKnownType.Color: WriteColor(writer, (Color)value); break; case EnKnownType.Version: WriteVersion(writer, value as Version); break; case EnKnownType.DbNull: // Do not write anything, it is already written as Nullable object. //WriteNullableType(true); break; case EnKnownType.Guid: WriteGuid(writer, (Guid)value); break; case EnKnownType.Uri: WriteUri(writer, value as Uri); break; default: throw new ArgumentOutOfRangeException(); } }
private void WriteEnum(BinaryWriter writer, Enum e) { // Int32 PrimitivesConvertion.WriteVarInt(writer, (int)((object)e)); }
private void WriteTimeSpan(BinaryWriter writer, TimeSpan timeSpan) { // Int64 PrimitivesConvertion.WriteVarInt(writer, timeSpan.Ticks); }
private void WriteBytes(BinaryWriter writer, byte[] bytes) { // Int32 PrimitivesConvertion.WriteVarInt(writer, bytes.Length); writer.Write(bytes); }