Как заставить ServiceStack сериализовать / десериализовать объект расширения с правильными типами

просто пытаюсь понять, насколько хорошо servicestack.text поддерживает сериализацию объектов экспло в и из json. Я знаю, что объект раскрытия реализует IDictionary. Когда я сериализуюсь в и из json, у меня возникают проблемы с получением правильных типов в десериализованном IDictionary. Поскольку Json изначально не поддерживает типы, а в servicestack есть параметр JsConfig.IncludeTypeInfo, я ожидал, что он включит информацию о типе в сериализованный json, чтобы позволить стеку службы десериализоваться в правильные типы с другой стороны (например, десятичный без десятичных знаков десериализуется в uint64).

Есть ли способ заставить servicetack корректно десериализовать те же типы, что и источник, используя объект раскрытия?

PS: я не хочу использовать объект poco для достижения этой цели, так как я не знаю свойств объекта до времени выполнения.

Ниже приведен быстрый тест, показывающий, что я имею в виду.

Спасибо

/// 
/// Test servicestack serialisation
/// I was expecting that IncludeTypeInfo=true would always add the type info
/// so when you deserialise into a IDictionary servicerstack
/// would have enough information to convert to the expected type
/// 
[Test]
public void TestDynamicSerialization()
{
    JsConfig.Reset();
    JsConfig.IncludeNullValues = true;
    JsConfig.IncludeTypeInfo = true;
    JsConfig.EmitCamelCaseNames = false;
    JsConfig.ConvertObjectTypesIntoStringDictionary = true;
    JsConfig.PropertyConvention = JsonPropertyConvention.Lenient;
    JsConfig.TryToParsePrimitiveTypeValues = true;

    // create an expando object
    dynamic obj = new ExpandoObject();

    // cast as a idictionary and set two decimals, one with decimnal places and one without
    var objDict = (IDictionary)obj;
    objDict["decimal1"] = 12345.222M;
    objDict["decimal2"] = 12345M;

    Assert.AreEqual(typeof(decimal), objDict["decimal1"].GetType());
    Assert.AreEqual(typeof(decimal), objDict["decimal2"].GetType());

    // serialise to json
    var json = JsonSerializer.SerializeToString(obj);

    //deserialise to a a IDictionary
    var deserialisedDict = JsonSerializer.DeserializeFromString(json);

    // make sure we got the expected types
    Assert.AreEqual(typeof(decimal), deserialisedDict["decimal1"].GetType());
    Assert.AreEqual(typeof(decimal), deserialisedDict["decimal2"].GetType(), "Fails because type is UInt64 expected decimal");


}

Ответы на вопрос(2)

Ваш ответ на вопрос