ServiceStack Bug序列化GUID,数字等(默认值为value并指定了SerializeFn)

时间:2018-10-11 02:13:12

标签: servicestack

当您尝试序列化一个为空(不是null,而是空)的Guid时,如果设置ExcludeDefaultValues = true,则结果将被忽略。 但是,如果您随后设置ExcludeDefaultValues = false,则会生成字符串““

JsConfig.IncludeNullValues = false;
JsConfig.ExcludeDefaultValues = false;
var tt = new { Name="Fred", Value=Guid.Empty, Value2=Guid.NewGuid() };
var test = JSON.stringify(tt);
Console.WriteLine(test);

给予

{"Name":"Fred","Value":"00000000000000000000000000000000","Value2":"598a6e08af224db9a08c2d0e2f6cff11"}

但是我们希望Guid在客户端格式化为Microsoft格式Guid,因此我们添加了一个序列化器:

JsConfig.IncludeNullValues = false;
JsConfig.ExcludeDefaultValues = false;
JsConfig<Guid>.SerializeFn = guid => guid.ToString();
var tt = new { Name="Fred", Value=Guid.Empty, Value2=Guid.NewGuid() };
var test = JSON.stringify(tt);
Console.WriteLine(test);

给予

{"Name":"Fred","Value2":"07a2d8c0-48ad-4e72-b6f3-4fec81c36a1d"}

因此SerializeFn的存在似乎使它忽略了配置设置,因此不可能生成空的Guid。 同样的错误也适用于数字,因此(如果像我们一样)将所有Double的格式都重新设置为小数点后三个位,如果为零,则将其忽略,这是错误的。

有人找到解决方法吗?

1 个答案:

答案 0 :(得分:3)

逐步检查源代码,似乎需要显式调出要包含Type的默认值的SerializeFnSource reference。请注意下面的Type行。


示例来源

JsConfig<Guid>.IncludeDefaultValue = true;

输出

JsConfig.Reset();
JsConfig.IncludeNullValues = false;
JsConfig.ExcludeDefaultValues = false;
JsConfig<Guid>.SerializeFn = guid => guid.ToString();
JsConfig<Guid>.IncludeDefaultValue = true;
var tt = new { Name = "Fred", Value = Guid.Empty, Value2 = Guid.NewGuid() };
var test = tt.ToJson();
Console.WriteLine(test);

您的问题陈述Gistlyn:请注意如何在控制台中返回默认GUID。

上面提出的答案Gistlyn:请注意这样做如何在控制台中返回默认GUID。

相关问题