剛才在網上閑逛,偶然看到一篇文章
網址是:http://www.companysz.com/iyangyuan/archive/2012/12/23/2829712.html#3140522
其中提到了C#與java如通過傳遞對象通信的問題 摘引如下:
通信關鍵: C#和java用Socket通信,發送數據和接收數據可以統一采用UTF-8編碼,經過測試,使用UTF-8編碼可以成功傳遞對象。 對于Socket技術,發送數據之前,一般將字符串轉換成字節數組,然后發送字節數組;接收數據時,收到的也是字節數組,很多時候需要轉換成字符串后使用。 下邊是一些常用的轉換。 C#語言字符串轉換成UTF-8字節數組: byte[] b = Encoding.UTF8.GetBytes("123"); C#語言UTF-8字節數組轉換成字符串: // receiveData是字節數組,receiveN是字節數組length string removeMsg = Encoding.UTF8.GetString(receiveData, 0, receiveN); Java語言字符串轉換成UTF-8字節數組: /* strContent 是要轉換的字符串*/ byte[] bs = strContent.getBytes("UTF-8"); Java語言UTF-8字節數組轉換成字符串: /* charArray 是UTF-8格式的字節數組,一般從IO流中獲取的時候就指定為UTF-8,read_rst 是字節數組length*/ String resultStr = new String(charArray, 0, read_rst); 序列化關鍵: 大家都知道,對象是保存在內存中的,具體點說是內存中的堆區。因此當我們嘗試保存、傳遞對象時,必須先把對象序列化,變成字符表示,把無形變成有形。 由于是跨語言的交互,我們即不能用Java特有的序列化方式,也不能用C#特有的序列化方式,必須找一個通用的序列化格式才能交互。顯然,Json是不二的選擇。 由此可知,我們需要Json完成以下功能: 經過測試,用如下方法可實現上述轉換。 C#端可以用開源項目JSON.NET,下載后根據自己的.NET版本,選擇相應的Newtonsoft.Json.dll,引用后再添加:using Newtonsoft.Json;using Newtonsoft.Json.Converters;即可使用。 C#用Json序列化對象方法: //te是要序列化的對象;obj是對象序列化后的字符串 string obj = JsonConvert.SerializeObject(te); C#用Json反序列化對象方法: //TestEntity是目標類型;obj是經過Json序列化的對象,字符串形式 TestEntity te = JsonConvert.DeserializeObject<TestEntity>(obj); Java端可以用開源項目google-gson,下載后是一個jar格式的包,直接在項目中導入這個包,并添加引用:import com.google.gson.Gson;即可使用。 Java用Json序列化對象方法: Gson gson = new Gson(); /*te是需要序列化的對象*/ String s = gson.toJson(te); Java用Json反序列化對象方法: Gson gson = new Gson(); /*s是經過Json序列化的對象,字符串類型;TestEntity是目標類型*/ /*注意:使用fromJson方法反序列化一個對象時,該對象的類型必須顯示的聲明一個不帶參數的構造方法*/ TestEntity te = gson.fromJson(s,TestEntity.class);摘引
想起來 NetworkComms V3中自帶了JSONSerializer 序列化器
NetworkComms V3中的JsonSerializer是對Newtonsoft.Json的包裝,使其更加方便的在networkComms V3框架中使用
先來做一個c#客戶端與c#服務器端通過json序列化方式通信的示例.
于是做了一個測試,新建工程文件如下:
MessageContract 中的 User類用于傳遞信息
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MessageContract{ public class User { public User() { } public string Name { get; set; } public int Age { get; set; } }}
ResMessag類,用于存儲返回的信息
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MessageContract{ public class ResMessage { public ResMessage() { } public string Message { get; set; } }}
客戶端代碼:
SendReceiveOptions sro = new SendReceiveOptions(DPSManager.GetDataSerializer<JSONSerializer>(), null, null);
MessageContract.User theUser = new MessageContract.User(); theUser.Name = "名山大川網絡工作室 "; theUser.Age = 30; ResMessage resMsg = newTcpConnection.SendReceiveObject<User, ResMessage>("ReqUser", "ResUser", 5000, theUser, sro, sro); MessageBox.Show("從服務器返回的信息是:"+resMsg.Message);
服務器端代碼:
SendReceiveOptions sro = new SendReceiveOptions(DPSManager.GetDataSerializer<JSONSerializer>(), null, null);
NetworkComms.AppendGlobalIncomingPacketHandler<User>("ReqUser", IncomingUserHandle);
PRivate void IncomingUserHandle(PacketHeader header, Connection connection, User msg) { try { ResMessage resMessage = new ResMessage(); resMessage.Message = msg.Name + "歡迎您"; connection.SendObject("ResUser", resMessage, sro); } catch (Exception ex) { LogTools.LogException(ex, "IncomingMsgHandle"); } }
示例運行成功,畫面如下:
Java好多年不用了,改天試試用java編寫個安卓的客戶端看看能不能與c#編寫的服務器通信,如果能這樣就太好了。
如果有寫的不對的地方,萬望您指出來,我好及時改正,不然有的網友又要說浪費他的時間了:)
www.networkComms.cn編輯
參考:
http://www.companysz.com/leonwang/archive/2011/08/12/2136497.html
http://www.companysz.com/wgp13x/p/0effafd9f5283cbf36e62b4fb5e94c81.html
http://www.companysz.com/zhanghaomars/p/3557644.html
新聞熱點
疑難解答