private void ParseOpaque(ref PacketReader reader) { var customType = (ColumnType)reader.ReadByte(); int length = ReadDataLength(ref reader); // In JSON fractional seconds part always has 3 bytes // Format is the same as ParseDateTime2 but data is in little-endian order // TIMESTAMP is converted to DATETIME by the server // DATETIME2 dates have ColumnType.DATETIME marker which is confusing switch (customType) { case ColumnType.DECIMAL: case ColumnType.NEWDECIMAL: int metadata = reader.ReadUInt16LittleEndian(); var number = ColumnParser.ParseNewDecimal(ref reader, metadata); _writer.WriteValue((string)number); break; case ColumnType.DATE: _writer.WriteDate(ReadDateTime(ref reader)); break; case ColumnType.TIME: case ColumnType.TIME2: _writer.WriteTime(ReadTime(ref reader)); break; case ColumnType.DATETIME: case ColumnType.DATETIME2: case ColumnType.TIMESTAMP: case ColumnType.TIMESTAMP2: _writer.WriteDateTime(ReadDateTime(ref reader)); break; default: var opaque = reader.ReadByteArraySlow(length); _writer.WriteOpaque(customType, opaque); break; } }
/// <summary> /// The encode. /// </summary> /// <param name="value">The value.</param> /// <param name="writer">The writer.</param> public void Encode(DateTime value, IJsonWriter writer) { writer.WriteDateTime(value); }
public override void Serialize(IJsonWriter writer, object value) { if (writer == null) { throw new ArgumentNullException("writer"); } if (value == null) { throw new ArgumentNullException("value"); } switch (primitiveTypeCode) { case TypeCode.Boolean: writer.WriteBoolean((bool)value); break; case TypeCode.Byte: writer.WriteNumber((byte)value); break; case TypeCode.DateTime: writer.WriteDateTime((DateTime)value); break; case TypeCode.Decimal: writer.WriteNumber((decimal)value); break; case TypeCode.Double: writer.WriteNumber((double)value); break; case TypeCode.Int16: writer.WriteNumber((short)value); break; case TypeCode.Int32: writer.WriteNumber((int)value); break; case TypeCode.Int64: writer.WriteNumber((long)value); break; case TypeCode.SByte: writer.WriteNumber((sbyte)value); break; case TypeCode.Single: writer.WriteNumber((float)value); break; case TypeCode.UInt16: writer.WriteNumber((ushort)value); break; case TypeCode.UInt32: writer.WriteNumber((uint)value); break; case TypeCode.UInt64: writer.WriteNumber((ulong)value); break; default: var valueStr = default(string); if (value is IFormattable) { valueStr = (string)Convert.ChangeType(value, typeof(string), writer.Context.Format); } else { valueStr = value.ToString(); } writer.WriteString(valueStr); break; } }