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>
此程式碼突顯了一個常見的反序列化問題:Dog
類型在 JSON 序列化後遺失。 標準 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中文網其他相關文章!