毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> net技术 >> 正文

C#如何把结构化的消息转化为字节流

更新时间:2013-8-4:  来源:毕业论文

C#如何把结构化的消息转化为字节流

打算建一对服务端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++的结构体来做, 有没有方便的办法?

随手写了点代码,不知道对楼主是否有帮助,一些辅助方法,向流读写数据,其中流的结构为:
Name字符串字节长度Name值Gender值Age值
按这个顺序写入流,读取的时候就知道该怎么读了

C# code?//向流中写入一个整型数据 public static void WriteInt(Stream outStream, int value) {     byte[] buffer = BitConverter.GetBytes(value);     outStream.Write(buffer, 0, buffer.Length); } //float public static void WriteFloat(Stream outStream, float value) {     byte[] buffer = BitConverter.GetBytes(value);     outStream.Write(buffer, 0, buffer.Length); } //bool public static void WriteBoolean(Stream outStream, bool value) {     byte[] buffer = BitConverter.GetBytes(value);     outStream.Write(buffer, 0, buffer.Length); } //向流中写入一个字符串:先写入字符串字节长度,再写入字符串 public static void WriteString(Stream outStream, string value) {     byte[] buffer = Encoding.Default.GetBytes(value);     WriteInt(outStream, buffer.Length);     outStream.Write(buffer, 0, buffer.Length); }   //从流中读取字符串 public static string ReadString(Stream inStream) {     byte[] buffer = new byte[128];     inStream.Read(buffer, 0, 4);     int length = BitConverter.ToInt32(buffer, 0);     inStream.Read(buffer,0,length);     return Encoding.Default.GetString(buffer, 0, length); }   //把结构化的数据转换成字节流 public void PeopleInfoToStream(Stream stream) {      WriteString(stream, People.Name);      WriteBoolean(stream, People.Gender);      WriteInt(stream, People.Age); }   //把字节流转换成结构化的数据 public People StreamToPeopleInfo(Stream stream) {     People info=new People();     byte[] buffer = new byte[128];     info.Name=ReadString(stream);     stream.Read(buffer, 0, 5);     info.Gender= BitConverter.ToBoolean(buffer, 0);     info.Age= BitConverter.ToInt32(buffer, 1);     return info; }

我们以udp发送一个消息为例,假设要发送一个命令,它是 Commands.SetGlobalData 类型的对象,那么我们可以写
C# code?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百种类命令,而且还在不断增加,怎样传送?

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

或者是
C# code?public class Command     {         public string TypeFullName;         public JToken Body;     }

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

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

总之,这是一个自动的网关程序设计,是给整个系统(不断增加的成百上千的命令)使用的。而不是那种“见到一个命令就开发一堆程序”的笨做法。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。