最近要來還一些技術債,要把以前的專案從 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.
