本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其是涉及一種反序列化方法及裝置。
背景技術(shù):
序列化和反序列化是計(jì)算機(jī)領(lǐng)域常用的技術(shù)。序列化用于將對(duì)象的屬性值轉(zhuǎn)換為序列化數(shù)據(jù),從而能夠?qū)π蛄谢瘮?shù)據(jù)進(jìn)行保存或者傳輸?shù)炔僮?。反序列化為序列化的逆過程,用于對(duì)序列化數(shù)據(jù)解析獲得對(duì)象的屬性值,根據(jù)屬性值對(duì)待重建對(duì)象的屬性進(jìn)行賦值。
舉例說明,user是一個(gè)表示用戶的類,user是一個(gè)user類的對(duì)象,user具有屬性:userid,屬性u(píng)serid的屬性值為0001。將user的屬性值保存為序列化數(shù)據(jù),例如xml格式或者json格式的數(shù)據(jù)的過程即為一種序列化,而從xml格式或者json格式的數(shù)據(jù)中解析出user的屬性值,根據(jù)user的屬性值對(duì)user的屬性進(jìn)行賦值的過程即為一種反序列化。
目前在實(shí)現(xiàn)反序列化時(shí),首先要通過反射的方式獲得待重建對(duì)象具有的屬性,之后通過解析序列化數(shù)據(jù)獲得屬性對(duì)應(yīng)的屬性值,并根據(jù)獲得的屬性值對(duì)屬性賦值。然而,目前在通過反射的方式獲得所述待重建對(duì)象具有的屬性時(shí),通常會(huì)占用較多的硬件資源,從而造成反序列化的效率較低。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)解決的技術(shù)問題在于提供一種反序列化方法及裝置,無需通過反射的方式獲得待重建對(duì)象具有的屬性,從而節(jié)約了硬件資源以提高反序列化的效率。
為此,本申請(qǐng)解決技術(shù)問題的技術(shù)方案是:
本申請(qǐng)?zhí)峁┝艘环N反序列化方法,包括:
獲取序列化數(shù)據(jù),所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性;
對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第一鍵值對(duì),所述第一鍵值對(duì)包括第一鍵信息和第一值信息,所述第一鍵信息與所述第一值信息具有對(duì)應(yīng)關(guān)系;
根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
可選的,所述序列化數(shù)據(jù)還包括所述待重建對(duì)象的第二屬性;所述方法還包括:
對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第二鍵值對(duì),所述第二鍵值對(duì)包括第二鍵信息和第二值信息,所述第二鍵信息與所述第二值信息具有對(duì)應(yīng)關(guān)系;
根據(jù)預(yù)先設(shè)置的所述第二鍵信息和所述第二屬性的對(duì)應(yīng)關(guān)系,將所述第二屬性賦值為所述第二鍵信息對(duì)應(yīng)的所述第二值信息。
可選的,所述第一屬性具有子屬性;
所述方法還包括:建立所述待重建對(duì)象的第一子對(duì)象;
所述根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,包括:
根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述子屬性的對(duì)應(yīng)關(guān)系,將所述第一子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
可選的,所述第一屬性為集合格式;
所述方法還包括:建立所述待重建對(duì)象的第二子對(duì)象,所述第二子對(duì)象為集合類型;
將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,包括:
通過循環(huán)方式將所述第二子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,以得到所述第二子對(duì)象的屬性值;
將所述第一屬性賦值為所述第二子對(duì)象的屬性值。
可選的,所述獲取序列化數(shù)據(jù),包括:
調(diào)用與所述待重建對(duì)象對(duì)應(yīng)的api;
獲取調(diào)用所述api的返回?cái)?shù)據(jù),將所述返回?cái)?shù)據(jù)作為所述序列化數(shù)據(jù)。
本申請(qǐng)還提供了一種反序列化裝置,包括:
獲取單元,用于獲取序列化數(shù)據(jù),所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性;
生成單元,用于對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第一鍵值對(duì),所述第一鍵值對(duì)包括第一鍵信息和第一值信息,所述第一鍵信息與所述第一值信息具有對(duì)應(yīng)關(guān)系;
賦值單元,用于根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
可選的,所述序列化數(shù)據(jù)還包括所述待重建對(duì)象的第二屬性;
所述生成單元還用于,對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第二鍵值對(duì),所述第二鍵值對(duì)包括第二鍵信息和第二值信息,所述第二鍵信息與所述第二值信息具有對(duì)應(yīng)關(guān)系;
所述賦值單元還用于,根據(jù)預(yù)先設(shè)置的所述第二鍵信息和所述第二屬性的對(duì)應(yīng)關(guān)系,將所述第二屬性賦值為所述第二鍵信息對(duì)應(yīng)的所述第二值信息。
可選的,所述第一屬性具有子屬性;
所述裝置還包括:第一建立單元,所述第一建立單元用于建立所述待重建對(duì)象的第一子對(duì)象;
所述賦值單元具體用于:
根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述子屬性的對(duì)應(yīng)關(guān)系,將所述第一子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
可選的,所述第一屬性為集合格式;
所述裝置還包括:第二建立單元,所述第二建立單元用于建立所述待重建對(duì)象的第二子對(duì)象,所述第二子對(duì)象為集合類型;
當(dāng)將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,所述賦值單元具體用于:
通過循環(huán)方式將所述第二子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,以得到所述第二子對(duì)象的屬性值;
將所述第一屬性賦值為所述第二子對(duì)象的屬性值。
可選的,所述獲取單元具體用于:
調(diào)用與所述待重建對(duì)象對(duì)應(yīng)的api;
獲取調(diào)用所述api的返回?cái)?shù)據(jù),將所述返回?cái)?shù)據(jù)作為所述序列化數(shù)據(jù)。
通過上述技術(shù)方案可知,本申請(qǐng)實(shí)施例在獲取序列化數(shù)據(jù)后,對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成第一鍵值對(duì),其中,所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性,所述第一鍵值對(duì)包括具有對(duì)應(yīng)關(guān)系的第一鍵信息和第一值信息。其中,由于所述待重建對(duì)象具有所述第一屬性是所述待重建對(duì)象的固有特征,因此本申請(qǐng)實(shí)施例中無需通過反射的方式獲得待重建對(duì)象具有的屬性,而是預(yù)先設(shè)置出所述第一屬性和所述第一鍵信息具有對(duì)應(yīng)關(guān)系,從而可以根據(jù)該對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,實(shí)現(xiàn)了對(duì)所述待重建對(duì)象的所述第一屬性的反序列化??梢?,由于本申請(qǐng)實(shí)施例中無需通過反射的方式獲得待重建對(duì)象具有的屬性,因此不需要占用過多的硬件資源,從而提高了反序列化的效率。
附圖說明
為了更清楚地說明本申請(qǐng)實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請(qǐng)的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,還可以根據(jù)這些附圖獲得其它的附圖。
圖1為本申請(qǐng)實(shí)施例提供的一種方法實(shí)施例的流程示意圖;
圖2為本申請(qǐng)實(shí)施例提供的另一種方法實(shí)施例的流程示意圖;
圖3為本申請(qǐng)實(shí)施例提供的一種裝置實(shí)施例的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面通過一個(gè)例子對(duì)目前反序列化的方式進(jìn)行說明。
user是一個(gè)表示用戶的類,user是一個(gè)user類的對(duì)象,即user類的一個(gè)實(shí)例,user具有屬性:userid,屬性u(píng)serid的屬性值為0001,通過序列化將user的屬性值0001轉(zhuǎn)換為序列化數(shù)據(jù),例如json格式的數(shù)據(jù):{“userid”:“0001”}
反序列化的過程是:首先通過反射的方式獲得user具有的屬性:userid,之后通過解析序列化數(shù)據(jù)獲得屬性對(duì)應(yīng)的屬性值,例如,將通過 反射獲得的屬性u(píng)serid與序列化數(shù)據(jù)進(jìn)行匹配,從而獲得屬性u(píng)serid對(duì)應(yīng)的屬性值為0001,再根據(jù)獲得的屬性值0001對(duì)屬性u(píng)serid賦值,即實(shí)現(xiàn)對(duì)屬性u(píng)serid的反序列化。當(dāng)對(duì)user的所有屬性均進(jìn)行賦值后,即實(shí)現(xiàn)重建對(duì)象user。
然而,在通過反射方式獲得user具有的屬性時(shí),通常會(huì)占用較多的硬件資源,從而造成反序列化的效率較低。
此外,這種方式還具有以下問題:由于一些編程語言并不支持通過反射方式獲得待重建對(duì)象具有的屬性,從而可能導(dǎo)致無法實(shí)現(xiàn)反序列化;由于序列化數(shù)據(jù)可能存在多種格式,例如xml格式或者json格式,因此針對(duì)于不同的格式需要編寫不同的程序代碼對(duì)待重建對(duì)象的屬性進(jìn)行賦值。
本申請(qǐng)實(shí)施例提供一種反序列化方法及裝置,無需通過反射的方式獲得待重建對(duì)象具有的屬性,從而節(jié)約了硬件資源以提高反序列化的效率。
為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)中的技術(shù)方案,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù)的范圍。
請(qǐng)參閱圖1,本申請(qǐng)實(shí)施例提供了反序列化方法的一種方法實(shí)施例,本實(shí)施例包括:
101:獲取序列化數(shù)據(jù),所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性。
本申請(qǐng)實(shí)施例中,所述序列化數(shù)據(jù)可以為xml格式或者json格式的數(shù)據(jù)。例如,所述序列化數(shù)據(jù)可以為json格式的數(shù)據(jù):
{“userid”:“0001”}
其中,userid為所述第一屬性。
所述序列化數(shù)據(jù)還包括第一屬性值,所述第一屬性與所述第一屬性值具有對(duì)應(yīng)關(guān)系。
102:對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第一鍵值對(duì)。
在本申請(qǐng)實(shí)施例中,可以對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成所述第一鍵值對(duì),所述第一鍵值對(duì)包括第一鍵信息(key)和第一值信息(value),所述 第一鍵信息和所述第一值信息具有對(duì)應(yīng)關(guān)系。其中,所述第一鍵信息用于表示所述第一屬性,所述第一值信息用于表示所述第一屬性值。
舉例說明,若所述序列化數(shù)據(jù)為json格式的數(shù)據(jù):
{“userid”:“0001”}
生成的所述第一鍵值對(duì)可以為:
{user.userid=0001}
其中,user.userid為所述第一鍵信息,0001為所述第一值信息。
103:根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
在本申請(qǐng)實(shí)施例中,由于所述待重建對(duì)象具有所述第一屬性是所述待重建對(duì)象的固有特征,因此本申請(qǐng)無需通過反射的方式獲得所述待重建對(duì)象具有的屬性,而是可以預(yù)先設(shè)置出所述待重建對(duì)象具有的所述第一屬性與所述第一鍵信息具有對(duì)應(yīng)關(guān)系,并根據(jù)該對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。其中,所述第一鍵信息可以看作是所述第一屬性的屬性值的路徑,本申請(qǐng)實(shí)際上利用該路徑,查找到所述第一屬性的屬性值,即所述第一值信息,從而利用所述第一值信息對(duì)所述第一屬性進(jìn)行賦值。
舉例說明,若所述第一鍵信息為:user.userid=0001,預(yù)先設(shè)置所述第一屬性u(píng)serid和所述第一鍵信息user.userid具有對(duì)應(yīng)關(guān)系,因此可以將userid賦值為user.userid對(duì)應(yīng)的0001,即令userid=0001。
通過上述技術(shù)方案可知,本申請(qǐng)實(shí)施例在獲取序列化數(shù)據(jù)后,對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成第一鍵值對(duì),其中,所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性,所述第一鍵值對(duì)包括具有對(duì)應(yīng)關(guān)系的第一鍵信息和第一值信息。其中,由于所述待重建對(duì)象具有所述第一屬性是所述待重建對(duì)象的固有特征,因此本申請(qǐng)實(shí)施例中無需通過反射的方式獲得待重建對(duì)象具有的屬性,而是預(yù)先設(shè)置出所述第一屬性和所述第一鍵信息具有對(duì)應(yīng)關(guān)系,從而可以根據(jù)該對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,實(shí)現(xiàn)了對(duì)所述待重建對(duì)象的所述第一屬性的反序列化??梢?,由于本申請(qǐng)實(shí)施例中無需通過反射的方式獲得待重建對(duì)象具有的屬性,因此不需要占用過 多的硬件資源,從而提高了反序列化的效率。
此外,由于本申請(qǐng)無需通過反射的方式獲得待重建對(duì)象具有的屬性,因此不再存在編程語言不支持的問題,使得本申請(qǐng)的方法實(shí)施例適用于多種不同的編程語言,例如java以及c#等。而且本申請(qǐng)首先根據(jù)反序列化數(shù)據(jù)生成所述第一鍵值對(duì),再根據(jù)所述第一鍵值對(duì)對(duì)所述第一屬性進(jìn)行賦值,即使所述序列化數(shù)據(jù)存在不同的格式,例如無論是xml格式還是json格式,也只需同一種程序即可實(shí)現(xiàn)對(duì)所述第一屬性的賦值。
在本申請(qǐng)實(shí)施例中,還可以通過調(diào)用應(yīng)用程序編程接口(英文:applicationprogramminginterface,簡(jiǎn)稱:api)的方式獲得所述反序列化數(shù)據(jù)。具體地,本實(shí)施例中的101包括:調(diào)用與所述待重建對(duì)象對(duì)應(yīng)的api;獲取調(diào)用所述api的返回?cái)?shù)據(jù),將所述返回?cái)?shù)據(jù)作為所述序列化數(shù)據(jù)。
在上述實(shí)施例中,只介紹了對(duì)所述第一屬性的反序列化過程,若所述待重建對(duì)象還包括除所述第一屬性之外的其他屬性,可以按照類似方式對(duì)其他屬性進(jìn)行反序列化。例如,所述待重建對(duì)象可以具有至少兩個(gè)屬性,則102中可以對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成鍵值對(duì)列表,所述鍵值對(duì)列表中包括至少兩個(gè)鍵值對(duì),每個(gè)鍵值對(duì)中的鍵信息和值信息具有對(duì)應(yīng)關(guān)系,103中通過鍵值對(duì)列表中的鍵信息查找相應(yīng)的值信息,并賦值給所述待重建對(duì)象的相應(yīng)的屬性。下面的實(shí)施例以所述待重建對(duì)象包括兩個(gè)屬性為例進(jìn)行說明。
請(qǐng)參閱圖2,本申請(qǐng)實(shí)施例提供了反序列化方法的另一種方法實(shí)施例,本實(shí)施例包括:
201:獲取序列化數(shù)據(jù),所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性和第二屬性。
例如,所述序列化數(shù)據(jù)可以為json格式的數(shù)據(jù):
{“userid”:“0001”,
“useraddress”:“address01”}
其中,所述第一屬性為屬性“userid”,所述第二屬性為“useraddress”。
所述序列化數(shù)據(jù)還包括第一屬性值和第二屬性值,所述第一屬性與所述第一屬性值具有對(duì)應(yīng)關(guān)系,所述第二屬性與所述第二屬性值具有對(duì)應(yīng)關(guān)系。
202:對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成鍵值對(duì)列表,所述鍵值對(duì)列表包括第一鍵值對(duì)和第二鍵值對(duì)。
所述第一鍵值對(duì)包括第一鍵信息和第一值信息,第一鍵信息和第一值信息具有對(duì)應(yīng)關(guān)系。所述第二鍵值對(duì)包括第二鍵信息和第二值信息,所述第二鍵信息與所述第二值信息具有對(duì)應(yīng)關(guān)系。其中,所述第一鍵信息用于表示所述第一屬性,所述第一值信息用于表示所述第一屬性值。所述第二鍵信息用于表示所述第二屬性,所述第二值信息用于表示所述第二屬性值。
舉例說明,若所述序列化數(shù)據(jù)為json格式的數(shù)據(jù):
{“userid”:“0001”,“useraddress”:“address01”}
生成的所述鍵值對(duì)列表可以為:
{user.userid=0001,user.useraddress=address01}
其中,user.userid為所述第一鍵信息,0001為所述第一值信息,user.useraddress為所述第二鍵信息,address01為所述第二值信息。
在java語言中,所述鍵值對(duì)列表可以存儲(chǔ)到map對(duì)象里。
203:根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,并且根據(jù)預(yù)先設(shè)置的所述第二鍵信息和所述第二屬性的對(duì)應(yīng)關(guān)系,將所述第二屬性賦值為所述第二鍵信息對(duì)應(yīng)的所述第二值信息。
舉例說明,若所述第一鍵信息為user.userid,所述第二鍵信息為user.useraddress,預(yù)先設(shè)置所述第一屬性“userid”和所述第一鍵信息“user.userid”具有對(duì)應(yīng)關(guān)系,并且預(yù)先設(shè)置所述第二屬性“useraddress”和所述第二鍵信息“user.useraddress”具有對(duì)應(yīng)關(guān)系,因此可以將“userid”賦值為“user.userid”對(duì)應(yīng)的0001,即令userid=0001,并且可以將“useraddress”賦值為“user.useraddress”對(duì)應(yīng)的address01,即令useraddress=address01。
還需說明的是,本申請(qǐng)中先根據(jù)所述反序列化數(shù)據(jù)生成所述第一鍵值對(duì),再根據(jù)所述第一鍵值對(duì)對(duì)所述第一屬性進(jìn)行賦值,而不是直接根據(jù)所述反序列化數(shù)據(jù)進(jìn)行賦值,還具有減少對(duì)所述反序列化數(shù)據(jù)的解析次數(shù)的技術(shù)效果。舉例說明,若所述序列化數(shù)據(jù)為json格式的數(shù)據(jù):
{“userid”:“0001”,
“useraddress”:“address01”}
待重建對(duì)象具有兩個(gè)屬性:userid和useraddress,若不生成所述第一鍵值對(duì)而直接對(duì)這兩個(gè)屬性進(jìn)行賦值,則至少對(duì)所述反序列化數(shù)據(jù)解析兩次,第一次解析為:將屬性u(píng)serid與所述反序列化數(shù)據(jù)進(jìn)行匹配,從而獲得屬性u(píng)serid對(duì)應(yīng)的屬性值為0001,第二次解析為:將屬性u(píng)seraddress與所述反序列化數(shù)據(jù)進(jìn)行匹配,從而獲得屬性u(píng)seraddress對(duì)應(yīng)的屬性值為address01。而如果采用本申請(qǐng)?zhí)峁┑姆葱蛄谢椒ǎ瑹o論所述待重建對(duì)象具有多少個(gè)屬性,只需對(duì)所述反序列化數(shù)據(jù)解析一次以生成鍵值對(duì)列表,之后根據(jù)所述鍵值對(duì)列表中的各個(gè)鍵值對(duì)對(duì)所述待重建對(duì)象的屬性進(jìn)行賦值??梢姳旧暾?qǐng)無需對(duì)所述待序列化數(shù)據(jù)進(jìn)行多次解析,從而減少了工作量。
在本申請(qǐng)實(shí)施例中,所述第一屬性可以為簡(jiǎn)單類型,也可以為復(fù)雜類型,下面分別說明。
簡(jiǎn)單類型指的是所述第一屬性不具有子屬性,即所述第一屬性為所述待重建對(duì)象的直接屬性。例如所述反序列化數(shù)據(jù)為json格式的數(shù)據(jù):
{“userid”:“0001”}
其中,userid為對(duì)象user的直接屬性,因此userid屬于簡(jiǎn)單類型。
對(duì)于簡(jiǎn)單類型,103中直接將所述第一屬性賦值為所述第一值信息即可。
例如,生成的所述第一鍵值對(duì)可以為:
{user.userid=0001}
其中,user.userid為所述第一鍵信息,0001為所述第一值信息。
可以通過以下java代碼對(duì)所述第一屬性進(jìn)行賦值:
user.setuserid(map.get("user.userid"));
上述代碼表示出預(yù)先設(shè)置了第一鍵信息user.userid和所述第一屬性u(píng)serid的對(duì)應(yīng)關(guān)系。map對(duì)象中存儲(chǔ)有所述第一鍵值對(duì)。
并且在上述代碼中,表示userid和user.userid均為字符串類型,因此無需作類型轉(zhuǎn)換。如果user.userid為字符串類型,userid為其他類型,例 如int類型,則需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,具體可以通過以下java代碼對(duì)所述第一屬性進(jìn)行賦值:
user.setuserid(integer.valueof(map.get("user.userid")));
復(fù)雜類型指的是所述第一屬性具有子屬性。例如所述反序列化數(shù)據(jù)為json格式的數(shù)據(jù):
{"vpcattributes":{"natipaddress":"address02"},
其中,vpcattributes為所述第一屬性,natipaddress為所述第一屬性vpcattributes的子屬性。
在本申請(qǐng)實(shí)施例中,若所述第一屬性為復(fù)雜類型,則本申請(qǐng)實(shí)施例還可以包括:建立所述待重建對(duì)象的第一子對(duì)象;其中所述第一子對(duì)象實(shí)際上為所述第一屬性。103中的所述根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,包括:根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述子屬性的對(duì)應(yīng)關(guān)系,將所述第一子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。下面舉例說明。
仍以上述json格式的數(shù)據(jù)為例,生成的所述第一鍵值對(duì)可以為:
{user.vpcattributes.natipaddress=address02}
其中,user.vpcattributes.natipaddress為所述第一鍵信息,address02為所述第一值信息。其中所述第一鍵信息對(duì)應(yīng)所述第一屬性和所述第一屬性的子屬性。
可以通過以下java代碼建立子對(duì)象vpcattributes:
vpcattributesvpcattributes=newvpcattributes();
可以通過以下java代碼對(duì)子對(duì)象vpcattributes的屬性進(jìn)行賦值:
vpcattributes.setnatipaddress(map.get("user.vpcattributes.natipaddress"));上述代碼表示出預(yù)先設(shè)置了第一鍵信息user.vpcattributes.natipaddress和子屬性natipaddress的對(duì)應(yīng)關(guān)系。
在本申請(qǐng)實(shí)施例中,所述第一屬性還可以為集合格式,此時(shí)可以通過循環(huán)方式對(duì)所述第一屬性進(jìn)行賦值。具體地,所述方法還包括:建立所述待重 建對(duì)象的第二子對(duì)象,所述第二子對(duì)象為集合類型;103中的將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,包括:通過循環(huán)方式將所述第二子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,以獲得所述第二子對(duì)象的屬性值;將所述第一屬性賦值為第二子對(duì)象的屬性值。其中,集合格式可以為list格式、set格式或者數(shù)組格式等。集合類型可以為list類型、set類型或者數(shù)組類型等。
下面舉例說明上述循環(huán)賦值方式。
所述反序列化數(shù)據(jù)可以為josn格式的數(shù)據(jù):
{"inneripaddress":
["10.165.103.41","10.165.103.42"]}
其中,inneripaddress為所述第一屬性,所述第一屬性為集合格式。
生成的所述第一鍵值對(duì)可以為:
{user.inneripaddress[0]=10.165.103.41}
其中,user.inneripaddress[0]為所述第一鍵信息,10.165.103.41為所述第一值信息。其中,所述第一鍵信息能夠表示出所述第一屬性為集合格式,并且能夠表示出所述第一值信息位于所述集合格式的所述第一屬性的位置。例如user.inneripaddress[0]表示所述第一值信息為所述第一屬性的第0位。
可以通過以下java代碼建立第二子對(duì)象inneripaddress:
list<string>inneripaddress=newarraylist<string>();
可以通過以下java代碼對(duì)第二子對(duì)象inneripaddress賦值:
可以通過以下java代碼對(duì)所述第一屬性賦值:
user.setinneripaddress(inneripaddress);
其中,user為所述待重建對(duì)象。
對(duì)應(yīng)與上述方法實(shí)施例,本申請(qǐng)還提供了反序列化裝置的實(shí)施例,下面 具體說明。
請(qǐng)參閱圖3,本申請(qǐng)實(shí)施例提供了反序列化裝置的一種裝置實(shí)施例,本實(shí)施例包括:獲取單元301、生成單元302和賦值單元303。
獲取單元301用于獲取序列化數(shù)據(jù),所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性。
本申請(qǐng)實(shí)施例,所述序列化數(shù)據(jù)可以為xml格式或者json格式的數(shù)據(jù)。
所述序列化數(shù)據(jù)還包括第一屬性值,所述第一屬性與所述第一屬性值具有對(duì)應(yīng)關(guān)系。
生成單元302用于對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第一鍵值對(duì)。
在本申請(qǐng)實(shí)施例中,生成單元302可以對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成所述第一鍵值對(duì),所述第一鍵值對(duì)包括第一鍵信息和第一值信息,所述第一鍵信息和所述第一值信息具有對(duì)應(yīng)關(guān)系。其中,所述第一鍵信息用于表示所述第一屬性,所述第一值信息用于表示所述第一屬性值。
賦值單元303用于根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述第一屬性的對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
在本申請(qǐng)實(shí)施例中,由于所述待重建對(duì)象具有所述第一屬性是所述待重建對(duì)象的固有特征,因此本申請(qǐng)無需通過反射的方式獲得所述待重建對(duì)象具有的屬性,而是可以預(yù)先設(shè)置出所述待重建對(duì)象具有的所述第一屬性與所述第一鍵信息具有對(duì)應(yīng)關(guān)系,并根據(jù)該對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。其中,所述第一鍵信息可以看作是所述第一屬性的屬性值的路徑,本申請(qǐng)實(shí)際上利用該路徑,查找到所述第一屬性的屬性值,即所述第一值信息,從而利用所述第一值信息對(duì)所述第一屬性進(jìn)行賦值。
通過上述技術(shù)方案可知,本申請(qǐng)實(shí)施例獲取單元301獲取序列化數(shù)據(jù)后,生成單元302對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成第一鍵值對(duì),其中,所述序列化數(shù)據(jù)包括待重建對(duì)象的第一屬性,所述第一鍵值對(duì)包括具有對(duì)應(yīng)關(guān)系的第一鍵信息和第一值信息。其中,由于所述待重建對(duì)象具有所述第一屬性是所述待重建對(duì)象的固有特征,因此本申請(qǐng)實(shí)施例中無需通過反射的方式獲得待重建對(duì)象具有的屬性,而是預(yù)先設(shè)置出所述第一屬性和所述第一鍵信息具有 對(duì)應(yīng)關(guān)系,從而賦值單元303可以根據(jù)該對(duì)應(yīng)關(guān)系,將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,實(shí)現(xiàn)了對(duì)所述待重建對(duì)象的所述第一屬性的反序列化。可見,由于本申請(qǐng)實(shí)施例中無需通過反射的方式獲得待重建對(duì)象具有的屬性,因此不需要占用過多的硬件資源,從而提高了反序列化的效率。
此外,由于本申請(qǐng)無需通過反射的方式獲得待重建對(duì)象具有的屬性,因此不再存在編程語言不支持的問題,使得本申請(qǐng)的裝置實(shí)施例適用于多種不同的編程語言,例如java以及c#等。而且本申請(qǐng)首先根據(jù)反序列化數(shù)據(jù)生成所述第一鍵值對(duì),再根據(jù)所述第一鍵值對(duì)對(duì)所述第一屬性進(jìn)行賦值,即使所述序列化數(shù)據(jù)存在不同的格式,例如無論是xml格式還是json格式,也只需同一種程序即可實(shí)現(xiàn)對(duì)所述第一屬性的賦值。
在本申請(qǐng)實(shí)施例中,還可以通過調(diào)用api的方式獲得所述反序列化數(shù)據(jù)。具體地,本實(shí)施例中的獲取單元301具體用于:調(diào)用與所述待重建對(duì)象對(duì)應(yīng)的api;獲取調(diào)用所述api的返回?cái)?shù)據(jù),將所述返回?cái)?shù)據(jù)作為所述序列化數(shù)據(jù)。
在上述實(shí)施例中,只介紹了對(duì)所述第一屬性的反序列化過程,若所述待重建對(duì)象還包括除所述第一屬性之外的其他屬性,可以按照類似方式對(duì)其他屬性進(jìn)行反序列化。例如,所述待重建對(duì)象可以具有至少兩個(gè)屬性,則生成單元302可以對(duì)所述序列化數(shù)據(jù)進(jìn)行解析生成鍵值對(duì)列表,所述鍵值對(duì)列表中包括至少兩個(gè)鍵值對(duì),每個(gè)鍵值對(duì)中的鍵信息和值信息具有對(duì)應(yīng)關(guān)系,賦值單元303通過鍵值對(duì)列表中的鍵信息查找相應(yīng)的值信息,并賦值給所述待重建對(duì)象的相應(yīng)的屬性。
例如,所述序列化數(shù)據(jù)還包括所述待重建對(duì)象的第二屬性。其中,所述序列化數(shù)據(jù)還包括第二屬性值,所述第二屬性與所述第二屬性值具有對(duì)應(yīng)關(guān)系。
生成單元302還用于,對(duì)所述序列化數(shù)據(jù)進(jìn)行解析以生成第二鍵值對(duì),所述第二鍵值對(duì)包括第二鍵信息和第二值信息,所述第二鍵信息與所述第二值信息具有對(duì)應(yīng)關(guān)系。所述第二鍵信息用于表示所述第二屬性,所述第二值 信息用于表示所述第二屬性值。所述第一鍵值對(duì)和所述第二鍵值對(duì)可以構(gòu)成鍵值對(duì)列表。在java語言中,所述鍵值對(duì)列表可以存儲(chǔ)到map對(duì)象里。
賦值單元303還用于,根據(jù)預(yù)先設(shè)置的所述第二鍵信息和所述第二屬性的對(duì)應(yīng)關(guān)系,將所述第二屬性賦值為所述第二鍵信息對(duì)應(yīng)的所述第二值信息。
還需說明的是,本申請(qǐng)中先根據(jù)所述反序列化數(shù)據(jù)生成所述第一鍵值對(duì),再根據(jù)所述第一鍵值對(duì)對(duì)所述第一屬性進(jìn)行賦值,而不是直接根據(jù)所述反序列化數(shù)據(jù)進(jìn)行賦值,還具有減少對(duì)所述反序列化數(shù)據(jù)的解析次數(shù)的技術(shù)效果。
在本申請(qǐng)實(shí)施例中,所述第一屬性可以為簡(jiǎn)單類型,也可以為復(fù)雜類型,下面分別說明。
簡(jiǎn)單類型指的是所述第一屬性不具有子屬性,即所述第一屬性為所述待重建對(duì)象的直接屬性。對(duì)于簡(jiǎn)單類型,賦值單元303直接將所述第一屬性賦值為所述第一值信息即可。
復(fù)雜類型指的是所述第一屬性具有子屬性。在本申請(qǐng)實(shí)施例中,若所述第一屬性為復(fù)雜類型,則本申請(qǐng)實(shí)施例的所述裝置還可以包括:第一建立單元,所述第一建立單元用于建立所述待重建對(duì)象的第一子對(duì)象;賦值單元301具體用于:根據(jù)預(yù)先設(shè)置的所述第一鍵信息和所述子屬性的對(duì)應(yīng)關(guān)系,將所述第一子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息。
在本申請(qǐng)實(shí)施例中,所述第一屬性還可以為集合格式,此時(shí)可以通過循環(huán)方式對(duì)所述第一屬性進(jìn)行賦值。具體地,所述第一屬性為集合格式;本申請(qǐng)實(shí)施例的所述裝置還包括:第二建立單元,所述第二建立單元用于建立所述待重建對(duì)象的第二子對(duì)象,所述第二子對(duì)象為集合類型;當(dāng)將所述第一屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,賦值單元303具體用于:通過循環(huán)方式將所述第二子對(duì)象的屬性賦值為所述第一鍵信息對(duì)應(yīng)的所述第一值信息,以得到所述第二子對(duì)象的屬性值;將所述第一屬性賦值為所述第二子對(duì)象的屬性值。其中,集合格式可以為list格式、set格式或者數(shù)組格式等。集合類型可以為list類型、set類型或者數(shù)組類型等。
所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實(shí)施例中的對(duì)應(yīng) 過程,在此不再贅述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本申請(qǐng)各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本申請(qǐng)的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:u盤、移動(dòng)硬盤、只讀存儲(chǔ)器(rom,read-onlymemory)、隨機(jī)存取存儲(chǔ)器(ram,randomaccessmemory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
以上所述,以上實(shí)施例僅用以說明本申請(qǐng)的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本申請(qǐng)進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案 的本質(zhì)脫離本申請(qǐng)各實(shí)施例技術(shù)方案的精神和范圍。