iT邦幫忙

0

把反序列化後的物件轉成class

我有一個class , 裡面包了N個小class。我在A程式把這個物件序列化,存成一個file。然後用B程式讀出這個file, 做反序列化。現在我卡在一個問題,我要用什麼方法,可以把這個反序列化後的物件,個別取出這N個小class? 用程式碼解釋一下我的問題:

我的class

    public class AModel
    {
        public List<BModel> bmodel { get; set; }
        public List<CModel> cmodel { get; set; }
    }
    
    public class BModel
    {
       public string field1 { get; set; }
       public string field2 { get; set; }
    }
    
    public class CModel
    {
       public string field1 { get; set; }
       public string field2 { get; set; }
    }

在A程式,將AModel 做序列化,存成檔案。在B程式,讀出檔案,做反序列化,然後用一個變數接收:(底下只show B程式的處理)

AModel amodel = new AModel;
...(省略讀檔案的程式)...
amodel = (AModel)deseralizer.ReadObject(ms); //ms 是MemoryStream

再來,我做了以下嘗試:

//dgvJSON 是 WindowsForm 的 DataGridView
var myTypeObj = amodel.GetType();
foreach (var obj in myTypeObj.GetMembers())
{
    DataGridView dgvJSON = new DataGridView();
    dgvJSON.AutoGenerateColumns = true;
    
    if (obj.Name.EndsWith("bmodel"))
        dgvJSON.DataSource = amodel.bmodel;
    else if (obj.Name.EndsWith("cmodel"))
        dgvJSON.DataSource = amodel.cmodel;
}

這樣的寫法是OK的,可以將子class的內容完整的show在 DataGridView.
不過我覺得這樣的寫法有點不smart,必須先知道每個class的名字,hardcode在程式裡。
有什麼方法可以不用事先知道每個class的名字,又能把class還原回來?(例如reflection做得到嗎?)

石頭 iT邦研究生 3 級 ‧ 2017-08-27 22:47:51 檢舉
請問一下 如果 amodel的型別是 AModel
那以下程式碼 會有矛盾吧?

if (obj.Name.EndsWith("bmodel"))
dgvJSON.DataSource = amodel.bmodel;
else if (obj.Name.EndsWith("cmodel"))
dgvJSON.DataSource = amodel.cmodel;

因為amodel.GetMembers(),一定會有這兩個成員變量amodel.bmodel 和 amodel.cmodel。
fillano iT邦超人 1 級 ‧ 2017-08-28 11:51:12 檢舉
reflection應該可以做到。

尚未有邦友回答

立即登入回答