[C#] 還技術債- 抽離序列化工具

2025-11-10

最近要來還一些技術債,要把以前的專案從 Newtonsoft.Json 換成 System.Text.Json

當初真的很偷懶,都是直接在程式裡呼叫 JsonConvert.SerializeObject() 或 DeserializeObject()

整個專案裡散落上百個地方,當然用全部取代也是可以但是還有更聰明的做法..

之後是希望專案能減少外部依賴。System.Text.Json 已經是 .NET 官方內建,效能也不錯,而且可以減少額外的 NuGet 套件。

但更重要的是,這次我想順便把這個功能抽象化之後要再換其他的也方便。


1. 我先新增一個簡單的介面,統一序列化與反序列化的操作

public interface IJsonSerializer { string Serialize<t>(T value); T Deserialize<t>(string json); } </t></t>

2. 然後實作一個版本使用 System.Text.Json

using System.Text.Json; public class SystemTextJsonSerializer : IJsonSerializer { public string Serialize<t>(T value) =&gt; JsonSerializer.Serialize(value); public T Deserialize<t>(string json) =&gt; JsonSerializer.Deserialize<t>(json); } </t></t></t>


3. 如果真的又想換回 Newtonsoft,也很簡單

using Newtonsoft.Json; public class NewtonsoftJsonSerializer : IJsonSerializer { public string Serialize<t>(T value) =&gt; JsonConvert.SerializeObject(value); public T Deserialize<t>(string json) =&gt; JsonConvert.DeserializeObject<t>(json); } </t></t></t>

4. 使用方法

public class FooService { private readonly IJsonSerializer _serializer; public FooService() { // 這裡決定要用哪個版本的 Serializer _serializer = new SystemTextJsonSerializer(); } public void Save(User user) { string json = _serializer.Serialize(user); File.WriteAllText("foo.json", json); } public User Load() { string json = File.ReadAllText("foo.json"); return _serializer.Deserialize<foo>(json); } } </foo>


說個結論,如果你是用 .net 之後版本可以用注入的方式使用,因為我是之前的舊專案,這次重構雖然只是抽介面換序列化工具

但是可以增加可維護性,而且之後要改序列設定,譬如首字小寫之類的都會變得比較方便

算是我還一下技術債,現在回頭慢慢整理,也是一種對自己程式設計習慣的反省。


當麻許的碎念筆記 2014 | Donma Hsu Design.