Как я могу установить FloatParseHandling.Decimal для пользовательского JsonConverter?
у нас есть структура DecimalDbValue , которая внутренне содержит только одно десятичное поле, которое я хочу де / сериализовать для всех его Типы.
Используется магическое число c (decimal.MinValue) для указания «нулевого» значения. Он был создан ранее. net 2.0 с типами значений, допускающими обнуление!
Это упрощенная версия нашей структуры: *
[Serializable]
[JsonConverter(typeof(DecimalDbValueJsonConverter))]
public struct DecimalDbValue : ISerializable
{
private readonly Decimal _decValue;
public DecimalDbValue(
decimal init)
{
_decValue = init;
}
[JsonConstructor]
public DecimalDbValue(
decimal? init)
{
if (init.HasValue)
_decValue = init.Value;
else
_decValue = decimal.MinValue;
}
private DecimalDbValue(
SerializationInfo objSerializationInfo,
StreamingContext objStreamingContext)
{
_decValue = objSerializationInfo.GetDecimal("value");
}
public bool IsNotNull
{
get
{
return !IsNull;
}
}
public bool IsNull
{
get
{
return _decValue.Equals(Decimal.MinValue);
}
}
public Decimal Value
{
get
{
return _decValue;
}
}
public void GetObjectData(
SerializationInfo info,
StreamingContext context)
{
info.AddValue("value", _decValue);
}
}
Я создал JsonConverter:
class DecimalDbValueJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(DecimalDbValue) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = reader.Value == null ? (decimal?)null : Convert.ToDecimal(reader.Value);
return new DecimalDbValue(value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var dbValue = (DecimalDbValue)value;
if (dbValue.IsNull)
writer.WriteNull();
else
writer.WriteValue(dbValue.Value);
}
}
и установите атрибут [JsonConverter(typeof(DecimalDbValueJsonConverter))]
в структуре DecimalDbValue
Я добавил тест:
[Test]
public void TestMaxDecimalDbValue()
{
var s = new DecimalDbValue(decimal.MaxValue);
var json = JsonConvert.SerializeObject(s, Formatting.Indented);
var x = JsonConvert.DeserializeObject<DecimalDbValue>(json);
Assert.AreEqual(s, x);
}
, но выдает: System.OverflowException : Value was either too large or too small for a Decimal.
Как можно я установил FloatParseHandling.Decimal
для JsonConverter? Как заставить это работать на MaxValue
? Есть ли какой-нибудь другой способ?
На самом деле я хотел бы, чтобы он сериализовался / десериализовался точно так же, как decimal?
(с дробным десятичным числом)
Спасибо