当值为默认值且指定了 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 重新格式化为小数点后三位,如果为零,它们将被省略,这是错误的。
有没有人找到解决方法?
逐步查看源代码,如果 Type
有 SerializeFn
,您似乎需要明确指出要包含哪些 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控制台。
当您尝试序列化一个空的(不是空的,而是空的)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 重新格式化为小数点后三位,如果为零,它们将被省略,这是错误的。
有没有人找到解决方法?
逐步查看源代码,如果 Type
有 SerializeFn
,您似乎需要明确指出要包含哪些 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控制台。