ServiceStack.Text:序列化一些未拾取的对象后,JsConfig更改完成

时间:2013-07-16 19:46:04

标签: c# json serialization servicestack

我正在使用ServiceStack.Text作为我服务中的默认序列化程序。

今天我遇到了一个意想不到的问题:

  • 其中一个服务后做了一些JsConfig配置 串行化
  • 并且使用了序列化器(即对象被序列化和反序列化)
  • 另一个稍后调用的服务尝试在其上添加自定义配置,但忽略了配置。

如果service2的自定义配置在一个级别上移动并在使用序列化程序之前完成,那么一切都按预期工作。

这是否意味着:

  • 配置只能在AppStart上完成,或者在使用序列化程序后无法覆盖?
  • 或者一旦使用序列化程序,可能会在某处缓存配置?如果是这样,缓存是否可以强制刷新自己?

你能想到会导致这类问题的其他事情吗?

我在每项服务中都使用版本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; }
    }
}

1 个答案:

答案 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必须通过测试。不知道为什么它是这样设计的,但这就是它目前的工作方式。