當我們使用 C# 進行開發專案的時候,通常需要把當時物件的狀態記錄下來,也許是下次啟動應用程式時候,再把這個物件重新建立起來,並且回原成為原來的狀態值;或者是在這個程式的別的地方,需要再度重顯呈現出這個物件。
基於這樣的需求,我們可以把這個物件序列化成為別的格式,在這裡,我們會把這個測試物件序列化成為 JSON 格式內容;我們將會透過
Newtonsoft.Json
這個 NuGet 套件,把 C# 中的指定物件序列化成為 JSON 定義,也可以透過這個套件,將 JSON 內容,反序列化成為一個新的物件。透過這樣的方法,您可以完成複製一個物件的功能
在這個練習中,我們將會使用到底下兩個類別,其中,我們將會建立
MyJSONClass<T>
這個泛型型別的物件,進行 JSON 序列與反序列化操作,而這個類別裡面會有兩個方法,分別將會提供這樣的功能。public class MyClass
{
public int ID { get; set; }
public string Name { get; set; }
public MyClass(int id, string name)
{
ID = id;
Name = name;
}
}
public class MyJSONClass<T>
{
public T MyObject { get; set; }
public string Content { get; set; }
public MyJSONClass(T myObject)
{
MyObject = myObject;
}
public void Serialize()
{
Content = JsonConvert.SerializeObject(MyObject);
}
public T Deserialize()
{
return JsonConvert.DeserializeObject<T>(Content);
}
}
進行測試
我們將使用底下程式碼進行測試
首先,我們建立一個
MyJSONClass<MyClass>
泛型類別物件 myJSONClassObject1
,並且把這個物件內的屬性進行初始化設定。
接著,我們呼叫這個類別的序列化方法,就會得到物件序列化後的 JSON 內容,我們在這裡也將當時物件的 HashCode 也列印出來,這樣用來區分在進行反序列化動作之後,是否會得到另外一個記憶體空間的全新物件。
最後,我們使用該類別的反序列化方法,得到一個新的物件,並且,同樣的把這個物件的 HashCode 也列印出來,證實,我們確實得到一個新的物件。
MyJSONClass<MyClass> myJSONClassObject1 =
new MyJSONClass<MyClass>(new MyClass(100, "Vulcan"));
myJSONClassObject1.Serialize();
MyClass myClassObject1 = myJSONClassObject1.MyObject;
Console.WriteLine($"JSON:{myJSONClassObject1.Content} / ID: {myClassObject1.ID} / HashCode: {myClassObject1.GetHashCode()}");
Console.WriteLine($"Press any key for continuing...{Environment.NewLine}");
Console.ReadKey();
MyClass myClassObject2 =
myJSONClassObject1.Deserialize();
myClassObject1.ID = 999;
Console.WriteLine($"JSON:{myJSONClassObject1.Content} / ID: {myClassObject1.ID} / HashCode: {myClassObject1.GetHashCode()}");
Console.WriteLine($"ID={myClassObject2.ID}, Name={myClassObject2.Name} / HashCode: {myClassObject2.GetHashCode()}");
Console.ReadKey();
執行結果內容
JSON:{"ID":100,"Name":"Vulcan"} / ID: 100 / HashCode: 44223604
Press any key for continuing...
JSON:{"ID":100,"Name":"Vulcan"} / ID: 999 / HashCode: 44223604
ID=100, Name=Vulcan / HashCode: 62468121