/// <summary> /// Obsolete - only backward compatibility /// </summary> internal static void WriteValue(BinaryWriter writer, DataTable dt, Encoding encoding) { if (dt == null) { WriteNullValue(writer); return; } // column count NumericSerializers.WriteUIntNullableMemberCount(writer, (uint)dt.Columns.Count); // table name WriteValue(writer, dt.TableName, encoding); // columns foreach (DataColumn col in dt.Columns) { WriteValue(writer, col.Caption, encoding); WriteValue(writer, col.ColumnName, encoding); var dataType = col.DataType?.ToString(); if (dataType != null && dataType.StartsWith("System.")) { dataType = "0." + dataType.Remove(0, "System.".Length); } WriteValue(writer, dataType, encoding); } NumericSerializers.WriteVarInt(writer, dt.Rows.Count); foreach (DataRow row in dt.Rows) { for (var colIndex = 0; colIndex < row.ItemArray.Length; colIndex++) { var item = row.ItemArray[colIndex]; var itemType = dt.Columns[colIndex].DataType; var basicTypeInfo = BoisTypeCache.GetBasicType(itemType); if (basicTypeInfo.KnownType == EnBasicKnownType.Unknown) { throw new Exception($"Serialization of DataTable with item type of '{itemType}' is not supported."); } var itemToWrite = item; if (itemType == typeof(string)) { itemToWrite = item == DBNull.Value ? null : item.ToString(); } else if (item == DBNull.Value) { itemToWrite = null; } // write the object WriteRootBasicType(writer, itemToWrite, itemType, basicTypeInfo, encoding); } } }
internal static void WriteRootBasicTypedArray(BinaryWriter writer, Array array, BoisBasicTypeInfo typeInfo, Encoding encoding) { if (array == null) { PrimitiveWriter.WriteNullValue(writer); return; } var arrayItemType = typeInfo.BareType; var arrayItemTypeType = BoisTypeCache.GetBasicType(typeInfo.BareType); // Int32 NumericSerializers.WriteUIntNullableMemberCount(writer, (uint)array.Length); for (int i = 0; i < array.Length; i++) { WriteRootBasicType(writer, array.GetValue(i), arrayItemType, arrayItemTypeType, encoding); } }
internal static T ReadEnumGeneric <T>(BinaryReader reader) { var type = typeof(T); var enumTypeInfo = BoisTypeCache.GetEnumType(type); if (enumTypeInfo == null) { throw new Exception($"Cannot determine the type of enum '{type.Name}'"); } switch (enumTypeInfo.KnownType) { case EnBasicEnumType.Int32: if (enumTypeInfo.IsNullable) { var val = NumericSerializers.ReadVarInt32Nullable(reader); if (val == null) { return(default); } return((T)Enum.ToObject(enumTypeInfo.BareType, val)); }
/// <summary> /// VarInt - Format: (Embedded-Nullable-0-0-0-0-0-0) [if not embedded?0-0-0-0-0-0-0-0] /// Embeddable range: 0..63 /// </summary> internal static void WriteValue(BinaryWriter writer, Enum e, Type type) { if (e == null) { WriteNullValue(writer); return; } var enumType = BoisTypeCache.GetEnumType(type); if (enumType == null) { throw new Exception($"Cannot determine the type of enum '{type.Name}'"); } switch (enumType.KnownType) { case EnBasicEnumType.Int32: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (int?)(int)(object)e); } else { NumericSerializers.WriteVarInt(writer, (int)(object)e); } break; case EnBasicEnumType.Byte: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (byte?)(byte)(object)e); } else { writer.Write((byte)(object)e); } break; case EnBasicEnumType.Int16: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (short?)(short)(object)e); } else { NumericSerializers.WriteVarInt(writer, (short)(object)e); } break; case EnBasicEnumType.Int64: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (long?)(long)(object)e); } else { NumericSerializers.WriteVarInt(writer, (long)(object)e); } break; case EnBasicEnumType.UInt16: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (ushort?)(ushort)(object)e); } else { NumericSerializers.WriteVarInt(writer, (ushort)(object)e); } break; case EnBasicEnumType.UInt32: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (uint?)(uint)(object)e); } else { NumericSerializers.WriteVarInt(writer, (uint)(object)e); } break; case EnBasicEnumType.UInt64: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (ulong?)(ulong)(object)e); } else { NumericSerializers.WriteVarInt(writer, (ulong)(object)e); } break; case EnBasicEnumType.SByte: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (sbyte?)(sbyte)(object)e); } else { writer.Write((sbyte)(object)e); } break; default: throw new Exception($"Enum type not supported '{type.Name}'. Contact the author please https://github.com/salarcode/Bois/issues "); } }
internal static Enum ReadEnum(BinaryReader reader, Type type) { var enumType = BoisTypeCache.GetEnumType(type); if (enumType == null) { throw new Exception($"Cannot determine the type of enum '{type.Name}'"); } switch (enumType.KnownType) { case EnBasicEnumType.Int32: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarInt32Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarInt32(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.Byte: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarByteNullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = reader.ReadByte(); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.Int16: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarInt16Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarInt16(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.Int64: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarInt64Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarInt64(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.UInt16: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarUInt16Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarUInt16(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.UInt32: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarUInt32Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarUInt32(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.UInt64: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarUInt64Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarUInt64(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.SByte: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarSByteNullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = reader.ReadSByte(); return((Enum)Enum.ToObject(enumType.BareType, val)); } default: throw new Exception($"Enum type not supported '{type.Name}'. Contact the author please https://github.com/salarcode/Bois/issues "); } }