Ejemplo n.º 1
0
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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));
                }
Ejemplo n.º 4
0
        /// <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 ");
            }
        }
Ejemplo n.º 5
0
        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 ");
            }
        }