最近做項(xiàng)目,需要C#與java間的交互,也就是C#編寫(xiě)服務(wù)器,java編寫(xiě)客戶端,讓兩者進(jìn)行通信。
通信無(wú)非就是互發(fā)數(shù)據(jù),首選Socket技術(shù),通過(guò)TCP協(xié)議建立長(zhǎng)連接,一般是以字節(jié)數(shù)組的形式傳遞數(shù)據(jù),也就是說(shuō),無(wú)論傳遞什么東東,都先拆成字節(jié)數(shù)組。
既然是面向?qū)ο缶幊,發(fā)送的數(shù)據(jù)要用實(shí)體類封裝,同時(shí)配合List<>泛型集合,可以達(dá)到非常好的靈活性、便捷性。
廢話少說(shuō),本文的核心問(wèn)題就是:C#與java如通過(guò)傳遞對(duì)象通信?
剛開(kāi)始我也很迷茫,不知道這個(gè)能不能實(shí)現(xiàn),但同時(shí)又很興奮,因?yàn)樽约涸谧鲆患苡幸馑嫉氖隆=?jīng)過(guò)探索研究,發(fā)現(xiàn)沒(méi)有問(wèn)題!可行!下面分享一下!
需要用到的核心技術(shù):
n Socket。
n Json。
下面詳細(xì)講解實(shí)現(xiàn)的關(guān)鍵步驟:
通信關(guān)鍵:
C#和java用Socket通信,發(fā)送數(shù)據(jù)和接收數(shù)據(jù)可以統(tǒng)一采用UTF-8編碼,經(jīng)過(guò)測(cè)試,使用UTF-8編碼可以成功傳遞對(duì)象。
對(duì)于Socket技術(shù),發(fā)送數(shù)據(jù)之前,一般將字符串轉(zhuǎn)換成字節(jié)數(shù)組,然后發(fā)送字節(jié)數(shù)組;接收數(shù)據(jù)時(shí),收到的也是字節(jié)數(shù)組,很多時(shí)候需要轉(zhuǎn)換成字符串后使用。
下邊是一些常用的轉(zhuǎn)換。
C#語(yǔ)言字符串轉(zhuǎn)換成UTF-8字節(jié)數(shù)組:
byte[] b = Encoding.UTF8.GetBytes("123");
C#語(yǔ)言UTF-8字節(jié)數(shù)組轉(zhuǎn)換成字符串:
// receiveData是字節(jié)數(shù)組,receiveN是字節(jié)數(shù)組length
string removeMsg = Encoding.UTF8.GetString(receiveData, 0, receiveN);
Java語(yǔ)言字符串轉(zhuǎn)換成UTF-8字節(jié)數(shù)組:
/* strContent 是要轉(zhuǎn)換的字符串*/
byte[] bs = strContent.getBytes("UTF-8");
Java語(yǔ)言UTF-8字節(jié)數(shù)組轉(zhuǎn)換成字符串:
/* charArray 是UTF-8格式的字節(jié)數(shù)組,一般從IO流中獲取的時(shí)候就指定為UTF-8,read_rst 是字節(jié)數(shù)組length*/
String resultStr = new String(charArray, 0, read_rst);
序列化關(guān)鍵:
大家都知道,對(duì)象是保存在內(nèi)存中的,具體點(diǎn)說(shuō)是內(nèi)存中的堆區(qū)。因此當(dāng)我們嘗試保存、傳遞對(duì)象時(shí),必須先把對(duì)象序列化,變成字符表示,把無(wú)形變成有形。
由于是跨語(yǔ)言的交互,我們即不能用Java特有的序列化方式,也不能用C#特有的序列化方式,必須找一個(gè)通用的序列化格式才能交互。顯然,Json是不二的選擇。
由此可知,我們需要Json完成以下功能:
經(jīng)過(guò)測(cè)試,用如下方法可實(shí)現(xiàn)上述轉(zhuǎn)換。
C#端可以用開(kāi)源項(xiàng)目JSON.NET,下載后根據(jù)自己的.NET版本,選擇相應(yīng)的Newtonsoft.Json.dll,引用后再添加:using Newtonsoft.Json;using Newtonsoft.Json.Converters;即可使用。
C#用Json序列化對(duì)象方法:
//te是要序列化的對(duì)象;obj是對(duì)象序列化后的字符串
string obj = JsonConvert.SerializeObject(te);
C#用Json反序列化對(duì)象方法:
//testEntity是目標(biāo)類型;obj是經(jīng)過(guò)Json序列化的對(duì)象,字符串形式
TestEntity te = JsonConvert.DeserializeObject<TestEntity>(obj);
Java端可以用開(kāi)源項(xiàng)目google-gson,下載后是一個(gè)jar格式的包,直接在項(xiàng)目中導(dǎo)入這個(gè)包,并添加引用:import com.google.gson.Gson;即可使用。
Java用Json序列化對(duì)象方法:
Gson gson = new Gson();
/*te是需要序列化的對(duì)象*/
String s = gson.toJson(te);
Java用Json反序列化對(duì)象方法:
Gson gson = new Gson();
/*s是經(jīng)過(guò)Json序列化的對(duì)象,字符串類型;TestEntity是目標(biāo)類型*/
/*注意:使用fromJson方法反序列化一個(gè)對(duì)象時(shí),該對(duì)象的類型必須顯示的聲明一個(gè)不帶參數(shù)的構(gòu)造方法*/
TestEntity te = gson.fromJson(s,TestEntity.class);
關(guān)鍵的部分就這些,其他的地方都非常容易實(shí)現(xiàn),網(wǎng)上有很多成熟的代碼,就不贅述了。