日期:2014-05-17  浏览次数:20970 次

怎么把结构化的消息转化为字节流?
打算建一对服务端S和客户端C,

C会发一些结构化的消息请求给S,比方数据库检索的请求:

Msg: 
{
MsgType: DatabaseInquire;
MsgPara: Name, Gender, Age;
Condition: SomeCondition;
}

S就要根据Msg进行数据库检索: select Name, Gender, Age from database.table where SomeCondition,

然后生成结构化的对象:

People
{
Name,
Gender,
Age,
}

S把这个People的信息发给C.

这个过程中必须要把结构化的消息转化成字节流, 收到字节流之后还得把它复原成结构化的消息, 网上看了一圈貌似蛮复杂啊,C#还要照着C++的结构体来做, 有没有方便的办法?
网络 结构 消息 字节流

------解决方案--------------------
我们以udp发送一个消息为例,假设要发送一个命令,它是 Commands.SetGlobalData 类型的对象,那么我们可以写
var cmd = new Commands.SetGlobalData
{
        data = x,
        isPartOfData = true,
        safeMode = safeMode
};
var message = Encoding.Utf8.GetBytes(JsonConvert.DeserializeObject(cmd));
new UdpClient().Send(message, message.Length, "211.340.109.21", 8899);

这就可以了。而接收的一端,不过是相反的操作,使用 Encoding.Utf8.GetString(...)得到json字符串,然后反序列化为 Commands.SetGlobalData 类型的对象。

你看到的那种“蛮复杂的”现象,反而是小程序。其实越是小气的程序,越是容易纠缠在复杂里边。
------解决方案--------------------
假设你有100百种类命令,而且还在不断增加,怎样传送?

你可以写一个通用的结构,例如
    public class Command
    {
        public string TypeFullName;
        public string Body;
    }

或者是
    public class Command
    {
        public string TypeFullName;
        public JToken Body;
    }

其中Body部分就是命令的实际内容,而TypeFullName则说明了命令对象在实体(Model)文件中类型名(包括命名空间)。这样,接收端就能够根据TypeFullName从字典中找到对应的类型,并将Body转换为命令对象实体。这不过是三四行代码就能搞定的事情。

而且你可以在Command中增加一些控制信息,例如命令的序列号、是否是转发给别的用户的,等等信息。