ServiceStack JSON シリアル化: 継承における型情報の維持
ServiceStack の JSON シリアル化では、データの破損を防ぐために型の処理を慎重に検討する必要があります。 これを例で説明してみましょう:
<code class="language-csharp">public class Container { public Animal Animal { get; set; } } public class Animal { } public class Dog : Animal { public void Speak() { Console.WriteLine("Woof!"); } } var container = new Container { Animal = new Dog() }; var json = JsonSerializer.SerializeToString(container); var container2 = JsonSerializer.DeserializeFromString<Container>(json); ((Dog)container.Animal).Speak(); // Works ((Dog)container2.Animal).Speak(); // InvalidCastException</code>
このコードは、一般的な逆シリアル化の問題を強調しています。つまり、JSON シリアル化後に Dog
型が失われます。 標準 JSON には固有の型情報がありません。
ServiceStack は、__type
プロパティを使用して JSON を拡張することでこの問題に対処します。これは型識別子として機能し、継承された型の正しい逆シリアル化を可能にします。 ただし、ServiceStack は必要な場合にのみこのプロパティを追加します (インターフェイス、遅延バインド オブジェクト、抽象クラス)。
Dog
型を保持するには、Animal
をインターフェースまたは抽象クラスとしてリファクタリングします。
<code class="language-csharp">public interface IAnimal // Interface { } public abstract class Animal // Abstract class { }</code>
ただし、一般的には、データ転送オブジェクト (DTO) での継承を避けることが推奨されます。
__type
のような独自の拡張機能により、相互運用性が損なわれます。__type
プロパティを賢明に使用し、これらのベスト プラクティスに従うことで、ServiceStack はシリアル化の速度と柔軟性を最適化しながら、継承された型の正確な逆シリアル化を保証します。
以上がServiceStack の JSON シリアル化は、継承されたクラスの型情報をどのように保持しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。