一、场景
C++ 订单 —> 接口编码 —> 网络 —> 接口解码 —> Java 订单
还可以更广泛一些,比如android调用c接口,只用一个jni接口来建立通道,其它所有接口都通过这个通道来传数据相互调用,再也不用写很多个接口了。
A语言—> 数据封解包 —> 通道 —> 数据封解包 —> B语言
如何实现远程函数的调用?
发送结构:包名,函数名,方法,参数,返回值。
接收处理:反射调用,返回返回值。
二、成熟方案:Protobuf、XML、Json等
原始数据结构 —> 序列化(转为字节流) —> 网络 —> 反序列化(逆运算) —> 特定语言的数据结构
序列化将特定语言的数据结构转换为字节流,反序列化是将字节流转换回特定语言的数据结构的逆运算。
三、示例:Json序列化和反序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//序列化操作
JavaScriptSerializer jss = new JavaScriptSerializer();
var json = new { name = "chenhao", age = 23 };
string str = jss.Serialize(json);
Console.WriteLine(str);
//反序列化操作
Person person = jss.Deserialize<Person>(str);
Console.WriteLine(person.name);
Console.ReadKey();
}
}
[Serializable]
public class Person
{
public string name { get; set; }
public int age { get; set; }
}
}
示例2: 使用Json.NET类库
class Program
{
static void Main(string[] args)
{
//序列化操作
var json = new { user = new { name = "fxhl", age = 23 }};
string jsonData = JsonConvert.SerializeObject(json);
Console.WriteLine(jsonData);
//反序列化操作方法一
Person p1= JsonConvert.DeserializeObject<Person>(jsonData);
Console.WriteLine(p1.user.name);
//反序列化操作方法二
string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]";
List<Person> listp2= JsonConvert.DeserializeObject<List<Person>>(json2);
Console.WriteLine(listp2[0].user.name);
Console.ReadKey();
}
}
public class Person
{
public Person user { get; set; }
public string name { get; set; }
public int age { get; set; }
}
三、示例:XML序列化和反序列化
略