C#(服务器)与Java(客户端)通过Socket传递对象(序列化 json)
下面详细讲解实现的关键步骤:
通信关键:
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);
关键的部分就这些,其他的地方都非常容易实现,网上有很多成熟的代码,就不赘述了。
C#(服务器)与Java(客户端)通过Socket传递对象(序列化 json)的更多相关文章
- JAVA基础知识之IO——对象序列化
对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...
- Java基础(二十九)Java IO(6)对象序列化(Object Serialization)
参考之前整理过的Java序列化与反序列化:https://www.cnblogs.com/BigJunOba/p/9127414.html 使用对象输入输出流可以实现对象序列化与反序列化,可以直接存取 ...
- java socket - 传递对象
Person类: package com.zhyea.olproxy.socket; import java.io.Serializable; public class Person implemen ...
- [转]C服务端与java客户端的socket通信注意事项
http://blog.csdn.net/gaoxin1076/article/details/7671752 Socket网络通讯开发总结之:Java 与 C进行Socket通讯 注意以下问题: 1 ...
- java调用(axis2)WebService传递对象类型参数(源码)
温馨提示:axis2 jar包哟 public static String pubRemoteFuc() { String endpoint = "http:/ ...
- Java编程的逻辑 (63) - 实用序列化: JSON/XML/MessagePack
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- java中为什么要进行对象序列化?
序列化其实很好理解,假如你现在做一个项目,项目是分工合作的,并且你喝其他小组成员不在同一个城市,那么你要如何把你写的那些类给其他小组成员呢?这个时候就要用到序列化了,简单的说:序列化就是将内存中的类或 ...
- RabbitMQ(3) Java客户端使用
RabbitMQ针对不同的开发语言(java,python,c/++,Go等等),提供了丰富对客户端,方便使用.就Java而言,可供使用的客户端有RabbitMQ Java client. Rabbi ...
- 在Java中使用Socket模拟客户端和服务端(多线程)
1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...
随机推荐
- [Windows Server 2008] Serv-U安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Serv- ...
- 12、scala函数式编程集合
1.Scala的集合体系结构 2.List 3.LikedList 4.Set 5.集合的函数式编程 6.函数式编程综合案例:统计单词总数 1.Scala的集合体系结构 Scala中集合体系主要包括: ...
- struts.xml详解
参考自:http://blog.csdn.net/zz_mm/article/details/5460397 1. 深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. ...
- js post一个对象 在C#中怎么接收? 未解决
这个在C#中怎么接收?
- jenkins配置邮件通知
参考: https://www.cnblogs.com/imyalost/p/8781759.html 谢谢大佬~
- 27.6 Parallel的静态For,Foreach和Invoke方法
static void Main(string[] args) { //for (int i = 0; i < 10000; i++) // DoWork(i); //Parallel.For( ...
- Django REST framework - 视图
目录 Django REST framework 视图GenericAPIView GenericAPIView 例子 属性 混入 具体视图类 自定义基类 Django REST framework ...
- Vue中数据的处理
临时变量参数的存储 1.引用类型和值类型的差异,及存储 2.在项目中做的绑定值,首先v-model 存储到临时变量,同时把数据在提交到api之前,需要做处理,因为是引用类型的数据,在处理之前,会修改掉 ...
- Mysql学习总结(41)——MySql数据库基本语句再体会
1.数据定义语言(DDL):定义和管理数据对象,比如建立数据库.数据表 数据操作语言(DML):用于操作数据库对象中的包含的数据. 数据查询语言(DQL):用于查询数据库对象中包含的数据,能够对表进行 ...
- Myeclipse学习总结(1)——Myeclipse优化配置
作为企业级开发最流行的工具,用Myeclipse开发java web程序无疑是最合适的,java web前端采用jsp来显示,myeclipse默认打开jsp的视图有卡顿的现象,那么如何更改jsp默认 ...