首頁 > 後端開發 > C++ > ServiceStack的JSON序列化如何保留繼承類別的類型資訊?

ServiceStack的JSON序列化如何保留繼承類別的類型資訊?

Mary-Kate Olsen
發布: 2025-01-21 12:52:11
原創
292 人瀏覽過

How Does ServiceStack's JSON Serialization Preserve Type Information for Inherited Classes?

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) 中的繼承:

  • DTO 應該是獨立的並且易於客戶理解;繼承增加了不必要的複雜性。
  • DTO 中的繼承會建立跨系統邊界的依賴關係,進而影響可維護性。
  • __type 這樣的專有擴充會損害互通性。

透過明智地使用 __type 屬性並遵循這些最佳實踐,ServiceStack 可確保繼承類型的準確反序列化,同時優化序列化速度和靈活性。

以上是ServiceStack的JSON序列化如何保留繼承類別的類型資訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板