2010-03-29 84 views
0

我已經序列化了一個C++對象,我希望爲它分配空間,儘管我不能使用「new」運算符,因爲我不知道對象的類。我嘗試使用malloc(sizeof(object)),儘管試圖將指針指向序列化對象的類型,程序關閉。關於對象類的信息存儲在哪裏?我序列化了一個C++對象,如何爲它分配內存而不知道它是什麼類型?

class object 
{ 
    public: 
    virtual void somefunc(); 
    int someint; 
}; 

class objectchild:public object 
{ 
} 

object *o=(object*)malloc(sizeof(objectchild)); 

cout << int(dynamic_cast<objectchild*>(o)) << endl; 

這會導致程序關閉。

預先感謝您。

+7

爲什麼不在序列化中包含類型信息? – kennytm 2010-03-29 13:42:34

+0

我不明白你的關心,你知道它的objectchild,但仍然不想使用新的,多數民衆贊成在奇怪。 – the100rabh 2010-03-29 13:53:27

+0

我有一個在char *變量中序列化的對象,我通過tcp/ip協議發送它,但我需要知道另一端是什麼對象,但是我希望通用地做到這一點,而不必每次添加算法都改變算法一個新班級......我寧願不做任何額外的圖書館。 – 2010-03-29 15:33:16

回答

2

你不應該混合使用C++和C內存路由。 dynamic_cast檢查物體的實際類型。你的情況,你有原始內存鑄造到object *

0

你需要下面的代碼

object *o = new objectchild; 

使用dynamic_cast

0

你正在試圖dynamic_cast一個沒有任何內存的位置。 malloc爲您提供了釋放空間來放置一個對象,但是直到new()運算符被調用時,沒有對象存在,所以當dynamic_cast確實是類型安全檢查時,它會失敗。你可以嘗試使用static_cast而不是dynamic_cast,因爲static不會進行類型安全性檢查,但實際上不應該混合使用C和C++分配/轉換類型。

1

重寫代碼,以便可以從序列化存檔中以某種方式讀取對象的類型。你可以通過字符串或者你使用的一些自定義值來實現,但它可能不是通用的。

例如,如果您要編寫CFoo對象,請首先將值「1」流化。如果您正在編寫CBar,請將數據流傳輸爲「2.

然後,在回讀歸檔時,如果看到」1「,則知道必須」新建「CFoo,並且如果讀取了」2 「你知道你有新的一個C杆。

或者,你可以使用一個全功能的序列化庫(或使用它作爲靈感)。 見例如boost::serialization

11

我已經系列化C++對象

我不確定你有沒有寫過這樣的東西:

object *p = new objectchild(); 
some_file.write((char*)p, sizeof(objectchild)); 

那麼你還沒有序列化你的對象。您已經將一些數據寫入文件,並且(在大多數實現中)數據包含指向vtable和類型信息的指針。當您「反序列化」數據時,在另一臺機器上或同一程序的另一臺機器上,vtable一般不會在同一地址,並且指針也沒用。

在C++中序列化對象的唯一方法是以您設計的已知格式編寫其數據成員。該已知格式應該包含足夠的信息來確定對象的類型。有一些框架可以幫助你做到這一點,但與Java不同的是,沒有內置到語言或標準庫中的機制。

相關問題