NetworkComms V3 使用Json序列化器进行网络通信
刚才在网上闲逛,偶然看到一篇文章
C#(服务器)与Java(客户端)通过Socket传递对象
网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/23/2829712.html#3140522
其中提到了 C#与java如通过传递对象通信的问题 摘引如下:
通信关键:
C#和java用Socket通信,发送数据和接收数据可以统一采用UTF-8编码,经过测试,使用UTF-8编码可以成功传递对象。
对于Socket技术,发送数据之前,一般将字符串转换成字节数组,然后发送字节数组;接收数据时,收到的也是字节数组,很多时候需要转换成字符串后使用。
下边是一些常用的转换。
C#语言字符串转换成UTF-8字节数组:
");
C#语言UTF-8字节数组转换成字符串:
// receiveData是字节数组,receiveN是字节数组length
, 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 = , 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 = ;
ResMessage resMsg = newTcpConnection.SendReceiveObject<User, ResMessage>(, 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.cnblogs.com/leonwang/archive/2011/08/12/2136497.html
http://www.cnblogs.com/wgp13x/p/0effafd9f5283cbf36e62b4fb5e94c81.html
http://www.cnblogs.com/zhanghaomars/p/3557644.html
NetworkComms V3 使用Json序列化器进行网络通信的更多相关文章
- ASP.NET MVC4 json序列化器
ASP.NET MVC4中调用WEB API的四个方法 2012年06月07日00:05 it168网站原创 作者:廖煜嵘 编辑:景保玉 我要评论(0) [IT168技术]当今的软件开发中,设计软件的 ...
- Newtonsoft.Json 序列化器的重写
public class TestConverter : JsonConverter { public override void WriteJson(JsonWriter writer, objec ...
- json序列化时datetime的处理方法
.net自带的json序列化器,JavaScriptSerializer和DataContractJsonSerializer,都是序列化成微软的datetime json格式,e.g. " ...
- Xml、Json序列化
Xml序列化: public class XmlHelper { private static string XmlPath = Path.Combine(AppDomain.CurrentDomai ...
- NetworkComms V3 序列化器之Protobuf.net和 JSONSerializer
NetworkComms v3版本中,默认使用的是protobuf.net序列化器. 即当您没有指定序列化的时候,系统自动使用默认的protobuf.net序列化器. 当然我们也可以自己指定序列化器 ...
- IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除
1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
- SpringBoot 默认json解析器详解和字段序列化自定义
前言 在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理 Sp ...
- ajax发送json格式与文件数据、django自带的序列化器(了解)
上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...
随机推荐
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- java Http编程小结
1:什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以reque ...
- Git 命令清单
这份命令清单并不完善,后期会根据使用情况再进行更改. 操作分支项目 1 下载仓库的一个分支(baooab-patch-1)的代码 git clone -b baooab-patch-1 https:/ ...
- Oracle(创建视图)
概念: 视图:所谓视图就是提取一张或者多张表的数据生成一个映射,管理视图可以同样达到操作原表的效果,方便数据的管理以及安全操作. 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关 ...
- 系统hosts文件的作用
host是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会 ...
- Asp.Net完美隐藏服务器信息
首先在Global.asax.cs里增加: protected void Application_PreSendRequestContent(object sender, EventArgs e){H ...
- JavaScript中有关数字的精确计算
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) ,我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会 ...
- Pod 的安装
1.如果之前已经安装过的 gem list --local | grep cocoapods 会看到如下输出: cocoapods (1.1.1)cocoapods-deintegrate (1.0. ...
- AOP 面向切面编程
AOP http://blog.csdn.net/xiang_j2ee/article/details/6851963 Android 支持 AspectJ 这个库来实现面向切面编程. 使用 Apac ...
- Js 常用函数
1. 算数函数(Math) 1)Js小数取整 常用于:分页算法 js 小数取整的函 .丢弃小数部分,保留整数部分 js:parseInt(/) .向上取整,有小数就整数部分加1 js: Math.ce ...