サービス内のデフォルトのシリアライザーとして ServiceStack.Text を使用しています。
今日、次のような予期しない問題に遭遇しました。
- サービスの 1 つがシリアライザーの JsConfig 構成を行った後
- シリアライザーが使用された (つまり、オブジェクトがシリアライズおよびデシリアライズされた)
- 後で呼び出された別のサービスは、その上にカスタム構成を追加しようとしましたが、構成は無視されました。
シリアライザーを使用する前に service2 のカスタム構成を 1 レベル上げて実行すると、すべてが期待どおりに機能しました。
それは次のことを意味しますか?
- 構成は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; }
}
}