概述
1.编方式:
- 使用标准的编码方式:如utf8,uft16等;
-
使用自定义的编码方式:如使用类型编号+传输值来代表要传统的方式;
如比要传输的内容为1:"FEnter",2:true,3:1000000
标准的编码方式就是按字符编码;
分析以上两种的编码的空间大小:标准的asci码,一个字节表示,一样;(就是多个了两个[“]特殊字符的处理)
数值每位一个字节;最多4/8字节就表示(long,double);
bool类型,如果直接用字符表示那就是4位,;1字节足够(其实1bit))就足够;如果使用json的那也是1/0,用一个1字节表示;
其它等等;
这是一个协议复杂度和空间的平衡;
-
接上来考查一下跨平台性,(序列化方式)
-
使用微软的的序列化方式(如下例),无法跨平台;除非根据协议实现;
-
使用json/xml的序列化方式,可以跨平台
-
使用自定义的序列化方式,根据公开的协议实现;
-
注意:
序列化和编码的关系:
序列化就是对特殊传输内容的一定编码处理,如对象序列化。
编码方式是在序列化基础之上的传输处理。
如ms的序列化和反序列化的类库,如下;
BinaryFormatter formatter = new BinaryFormatter();
//序列化mybook对象,序列化到myMemoryStream流对象
formatter.Serialize(myMemoryStream, mybook);
#region 将流中的数据转换为字符串
byte[] resultByte = myMemoryStream.GetBuffer();
string resultStr = Encoding.UTF8.GetString(resultByte);
2.流压缩:
如下摘自memocache.client;
如果giz的字段数大于2048,那就有问题,流的读取有问题;
GZipInputStream giz = new GZipInputStream(new MemoryStream(buf));
MemoryStream bos = new MemoryStream(buf.Length);
int count;
byte[] tmp = new byte[2048];
while((count = giz.Read(tmp, 0, tmp.Length)) > 0)
{
bos.Write(tmp, 0, count);
}
// store uncompressed back to buffer
buf = bos.ToArray();
gzi.Close();
正常处理如下:
GZipInputStream giz = new GZipInputStream(new MemoryStream(buf));
MemoryStream bos = new MemoryStream(buf.Length);
int count=0;
int inc=0
byte[] tmp = new byte[2048];
while((count = giz.Read(tmp, inc, tmp.Length-inc)) > 0)
{
bos.Write(tmp, inc, count);
inc+=count;
}
// store uncompressed back to buffer
buf = bos.ToArray();
gzi.Close();
最后
以上就是神勇咖啡为你收集整理的通信涉及到的一些关键因素的全部内容,希望文章能够帮你解决通信涉及到的一些关键因素所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复