我正在使用ServiceStack.Text作为我服务中的默认序列化程序。
今天我遇到了一个意想不到的问题:
如果service2的自定义配置在一个级别上移动并在使用序列化程序之前完成,那么一切都按预期工作。
这是否意味着:
你能想到会导致这类问题的其他事情吗?
我在每项服务中都使用版本3.9.35。 所有3项服务都是WebApi项目。
我写了一个非常简单的控制台应用程序来演示这个问题:
namespace SerializationTest
{
class Program
{
static void Main(string[] args)
{
var foo = new Foo() {Id = "abcdef", Type = "standardFoo"};
var bar = new Bar() {Color = "red", Number = 10};
JsConfig<Foo>.IncludeTypeInfo = true;
var serializedFoo = JsonSerializer.SerializeToString(foo);
var serializedBar = JsonSerializer.SerializeToString(bar);
var deserializedFoo = JsonSerializer.DeserializeFromString<Foo>(serializedFoo);
var deserializedBar = JsonSerializer.DeserializeFromString<Bar>(serializedBar);
JsConfig<Foo>.IncludeTypeInfo = false;
JsConfig<Bar>.IncludeTypeInfo = true;
var serializedFoo2 = JsonSerializer.SerializeToString(foo);
var serializedBar2 = JsonSerializer.SerializeToString(bar);
var deserializedFoo2 = JsonSerializer.DeserializeFromString<Foo>(serializedFoo2);
var deserializedBar2 = JsonSerializer.DeserializeFromString<Bar>(serializedBar2);
Console.ReadKey();
}
}
public class Foo
{
public string Id { get; set; }
public string Type { get; set; }
}
public class Bar
{
public int Number { get; set; }
public string Color { get; set; }
}
}
答案 0 :(得分:1)
而不是尝试否定IncludeTypeInfo属性。使用ExcludeTypeInfo。
看一下内部类WriteType。为了确定是否在序列化中包含类型,它会检查一些事情。
首先,它检查所有四个静态bool属性。有一般的JsConfig值和类型特定值。由于逻辑“OR”
,General将整体具体类型private static bool IsIncluded
{
get
{
return (JsConfig.IncludeTypeInfo || JsConfig<T>.IncludeTypeInfo);
}
}
private static bool IsExcluded
{
get
{
return (JsConfig.ExcludeTypeInfo || JsConfig<T>.ExcludeTypeInfo);
}
}
然后在
中有这个方法private static bool ShouldSkipType() { return IsExcluded && !IsIncluded; }
因此,您将看到为了跳过Exclude和Include必须通过测试。不知道为什么它是这样设计的,但这就是它目前的工作方式。