当值为默认值且指定了 SerializeFn 时,ServiceStack 序列化 GUID、数字等的错误

ServiceStack Bug serializing GUIDs, numbers, etc. when value is default and SerializeFn is specified

当您尝试序列化一个空的(不是空的,而是空的)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 重新格式化为小数点后三位,如果为零,它们将被省略,这是错误的。

有没有人找到解决方法?

逐步查看源代码,如果 TypeSerializeFn,您似乎需要明确指出要包含哪些 Type 的默认值。 Source reference。请注意下面的 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);

输出

{"Name":"Fred","Value":"00000000-0000-0000-0000-000000000000","Value2":"b86c4a18-db07-42f8-b618-6263148219ad"}

您的问题陈述Gistlyn:请注意它如何不 return控制台。

上面提出的答案Gistlyn:注意它是如何return控制台。