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

  • 31
  • 0

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

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

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

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

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


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

    public interface IJsonSerializer
    {
    	string Serialize(T value);
        T Deserialize(string json);
    }

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

    
      using System.Text.Json;

      public class SystemTextJsonSerializer : IJsonSerializer
      {
          public string Serialize(T value)
              => JsonSerializer.Serialize(value);

          public T Deserialize(string json)
              => JsonSerializer.Deserialize(json);
      }
      

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

     
      using Newtonsoft.Json;

      public class NewtonsoftJsonSerializer : IJsonSerializer
      {
          public string Serialize(T value)
              => JsonConvert.SerializeObject(value);

          public T Deserialize(string json)
              => JsonConvert.DeserializeObject(json);
      }

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(json);
              }
          }
          
          

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

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

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

 

---

請你暫時把你的勇氣給我 在夢想快消失的時候 讓我的 Code 用力的穿過天空 為愛我的人做一秒英雄 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力…

Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer.