2017年9月28日 星期四

C# : 泛型 Generic 類別的物件序列化

當我們使用 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

沒有留言:

張貼留言