上学期的软件创新实践作业,简单的网络的编程(tcp/ip)和多线程,试着回忆得记录下来,因为花了比较多的时间,对我来说也是收获颇丰。
使用VS2012+SqlServer2008,c#,我将在这次作业中所得大致归为以下几类:
一 、数据库方面我采用了对我而言较新的DataBaseFirst + Entity Framework,二者都是大二暑假在亚尔迪公司实习时接触到的新知识,和asp.net MVC一样,全新的概念给我很大的冲击和学习热情,因此想借此机会好好熟悉下。
DataBaseFirst + Entity Framework 大致可以参考 http://hi.baidu.com/wyg_bd/item/0be876f402abdabe30c1995c
EF将数据库对象抽象成为c#里的类,修改数据的操作也变成了简单的对象方法的调用,如sql的查询语句在EF里可以这样写:
var check_user = data.listUsers.Where(p => p.Uid == loginResult.getUid).FirstOrDefault();
这里的 var 编译器根据返回值类型自动定义check_user的数据类型,对编译器来说增加负担,所以不被建议。
并且美中不足的是听说EF在大型系统中的效率不高,我相信EF会被开发的更加成熟而不是被淘汰。
二、一起客户端的数据请求都经过了服务端的中转,包括数据库访问。和用java写的同学交流了一下,他们用了java自己封装的一个类,可以用socket直接发送类,我也希望自己用c#也能做到,查阅资料,整了半天也成功了,大致如下:
//序列化二进制代码
public static byte[] Serialize(Obj obj)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] b;
formatter.Serialize(ms, obj);
ms.Position = 0;
b = new byte[ms.Length];
ms.Read(b, 0, b.Length);
ms.Close();
return b;
}
//反序列化二进制代码
public static Obj Deserialize(byte[] byteArray)
{
IFormatter formatter = new BinaryFormatter();
//formatter.Binder = new UBinder();
MemoryStream ms = new MemoryStream();
ms.Write(byteArray, 0, byteArray.Length);
ms.Position = 0;
Obj obj = formatter.Deserialize(ms) as Obj;
return obj;
}
序列化是将传入的obj(数据包的类)这个对象在内存中的二进制流存在byte数组中,再使用socket发送转化后的二进制数组byte,接收后再强转成我写的数据包类。
这其中遇到的问题是服务端和客户端不在同一个项目里,数据包类的环境不同,反序列化出错,解决办法是新建第三个项目,重新定义了数据包类,导出为dll文件,再导入服务端和客户端的项目里,代替原来的数据包类。
接下来的工作顺利的很多,但是工作量略大,每天写到半夜一两点,作业还是晚交了两天。其实最郁闷的是因为之前参加过老师的项目,直接给了优,连检查都没有。