servicestack.text が json との間の expando オブジェクトのシリアル化をどの程度サポートしているかを調べようとしています。expando オブジェクトが IDictionary を実装していることは知っています。json との間でシリアル化すると、逆シリアル化された IDictionary で正しい型を取得するのに問題があります。Json は型をネイティブにサポートしておらず、servicestack には JsConfig.IncludeTypeInfo という設定があるため、シリアル化された json に型情報を含めて、サービス スタックが反対側で正しい型に逆シリアル化できるようにすることを期待していました (たとえば、小数点以下の桁数のない 10 進数)。 uint64 にデシリアライズされます)。
expando オブジェクトを使用して、サービススタックにソースと同じ型を正しく逆シリアル化させる方法はありますか?
Ps: 実行時までオブジェクトのプロパティがわからないため、これを実現するために poco オブジェクトを使用したくありません。
以下は、私が何を意味するかを示す簡単なテストです。
ありがとう
/// <summary>
/// Test servicestack serialisation
/// I was expecting that IncludeTypeInfo=true would always add the type info
/// so when you deserialise into a IDictionary<string,object> servicerstack
/// would have enough information to convert to the expected type
/// </summary>
[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<string, object>)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<string,object>
var deserialisedDict = JsonSerializer.DeserializeFromString<IDictionary<string, object>>(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");
}