C 中,不同類的例項的序列化問題

2021-03-31 08:56:30 字數 953 閱讀 1459

假設編寫乙個圖形程式設計程式,所有的圖形類都有共同的父類graphics。graphics類中提供了進行序列化的介面serialize()。

現在當使用者使用該圖形編輯器建立了多個圖形物件(即建立了多個graphics的子類的例項,這些例項可以通過乙個chain of responsibility連線起來),並希望將該圖形儲存到乙個檔案裡面。我們需要遍歷該職責鏈,依次呼叫每個例項的serialize方法。

問題隨之產生

:我們如何讀取這些記錄呢?我們怎麼知道當前的讀取的資料是哪個子類的例項的資料呢?產生這個問題的根本在於我們無法將類的型別資訊儲存到檔案中

乙個解決辦法是:在存入檔案的時侯,每個類都寫入乙個唯一的id資訊;那麼在讀入的時侯,我們可以通過該id資訊知道這是哪個類的例項的資料。大概的**可能是這樣的:

void serialize(carchive & ar)

newinstance.serialize(ar);}}

但是這似乎並不是乙個好方法,因為每次當我們新增加乙個子類的時侯,都需要為其手工增加乙個id,而且需要在上面**中的switch...case結構中增加乙個相應的入口。當子類的數目眾多,或者子類的種類在不斷變化的時候,這樣做就非常不可靠了。

其實可以通過型別註冊來解決這個問題。

首先解決id的問題,這個可以借助loki庫的typelist(參見我的另外一篇文章)。

我們可以使用乙個資料結構來儲存所有的子類的資訊(通過儲存乙個該類的例項的方式來儲存該類的資訊)

class abstractbuilder{};

template class builder:public abstractbuilder

};//...

void regsiterclassinfo()

void serialize(carchive& ar)

}newinstance->serialize(ar);

}

C 中的序列化

序列化的作用 物件的序列化是將物件轉換為二進位制資料 位元組流 而反序列化是將二進位制資料還原為物件,物件是稍縱即逝,好比如程式重啟 退出函式範圍等等都會造成物件的消失,序列化和反序列化的作用都是為了保持物件的持久化!和序列化有關的類 1.binaryformatter類,他主要有兩個方法乙個是 v...

c 序列化問題

1.什麼是序列化 序列化是將物件狀態轉換為可保持或傳輸的格式的過程,在序列化過程中,物件的公共欄位和私有字段以及類的名稱 包括包含該類的程式集 都被轉換為位元組流,然後寫入資料流。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料。2.為什麼使用序列化 a.乙個...

C 中的Json的序列化和反序列化

json是一種通用的資料格式,我們在資料交換的時候,經常會用到,下面介紹c 中的json序列化和反序列化,當然也可用在asp.net,silverlight,wpf中。我們在下面例項講解如何進行json的序列化和反序列化,本文介紹兩種方案,net 3.5原生json操作和json.net中的json...