经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
近期开发项目中用到的编码小技巧汇总说明(二)
来源:cnblogs  作者:梦在旅途  时间:2018/11/3 10:08:40  对本文有异议

之前有总结发表过《近期开发项目中用到的编码小技巧汇总说明》,虽没有涉及什么高大上的东西,但都是一些很实用的平时大家可能用到的知识,今天继续分享一些小技巧,欢迎大家了解,不足之处,可以直接评论留言谢谢!

接上篇序号

6.解决当同一个类在不同的项目中(命名空间不同,但类的定义完全相同的情况)使用BinaryFormatter进行序列化后再反序列化时出现找不到程序集的问题或反序列化的结果为null

原代码:(DataSetSurrogate分别在API项目中,客户端项目中都存在,类定义一样但由于不在同一个项目,即使命名空间改成一样仍然是会报错的)

  1. public static DataSet GZipBytesToDataSet(byte[] data)
  2. {
  3. byte[] buffer2 = data;
  4. BinaryFormatter ser = new BinaryFormatter();
  5. var ms = new MemoryStream(buffer2);
  6. var obj = ser.Deserialize(ms);
  7. DataSetSurrogate dss = obj as DataSetSurrogate;
  8. return dss.ConvertToDataSet();
  9. }

报错原因是:序列化后的byte数组中包含了程序集的信息,故如果想要在另一个程序集中成功的反序列化,则需要动态替换反序列化中的类型对应的程序集信息,改进后的代码:

先定义一个类型名称替换序列化绑定器:

  1. public class TypeNameConvertBinder : SerializationBinder
  2. {
  3. public TypeNameConvertBinder():base()
  4. {
  5.  
  6. }
  7.  
  8. public TypeNameConvertBinder(string oldNameSapce, string newNameSapce):this()
  9. {
  10. this.OldNameSapce = oldNameSapce;
  11. this.NewNameSapce = newNameSapce;
  12. }
  13.  
  14. public string OldNameSapce { get; set; }
  15.  
  16. public string NewNameSapce { get; set; }
  17.  
  18. public override Type BindToType(string assemblyName, string typeName)
  19. {
  20. typeName = typeName.Replace(OldNameSapce, NewNameSapce);
  21. assemblyName = assemblyName.Replace(OldNameSapce, NewNameSapce);
  22. return Type.GetType(string.Format("{0}, {1}", typeName, assemblyName));
  23. }
  24. }

然后序列化的时候直接给 BinaryFormatter设置Binder即可,代码如下:

  1. public static DataSet GZipBytesToDataSet(byte[] data)
  2. {
  3. byte[] buffer2 = data;
  4. BinaryFormatter ser = new BinaryFormatter();
  5. ser.Binder = new TypeNameConvertBinder() { OldNameSapce = "WMS.Common", NewNameSapce = "Zuowj" };
  6. var ms = new MemoryStream(buffer2);
  7. var obj = ser.Deserialize(ms);
  8. DataSetSurrogate dss = obj as DataSetSurrogate;
  9. return dss.ConvertToDataSet();
  10. }  

以上这样就解决了序列化时因为程序集不相同而导致的反序列化失败的问题。

7.控制台程序中实现输入密码遮罩功能,这个功能我是摘抄自网上的,还可以有优化空间

实现代码如下:

  1. static string ReadLineForPassword()
  2. {
  3. string input = null;
  4. while (true)
  5. {
  6. //存储用户输入的按键,并且在输入的位置不显示字符
  7. ConsoleKeyInfo ck = Console.ReadKey(true);
  8.  
  9. //判断用户是否按下的Enter键
  10. if (ck.Key != ConsoleKey.Enter)
  11. {
  12. if (ck.Key != ConsoleKey.Backspace)
  13. {
  14. //将用户输入的字符存入字符串中
  15. input += ck.KeyChar.ToString();
  16. //将用户输入的字符替换为*
  17. Console.Write("*");
  18. }
  19. else
  20. {
  21. if (!string.IsNullOrEmpty(input)
  22. && input.Length >= 1)
  23. {
  24. input = input.Remove(input.Length - 1, 1);
  25. }
  26. //删除错误的字符
  27. Console.Write("\b \b");
  28. }
  29. }
  30. else
  31. {
  32. Console.WriteLine();
  33. break;
  34. }
  35. }
  36.  
  37. return input;
  38. }
  39.  
  40.  
  41. //使用:
  42. string token = ReadLineForPassword();

 这样当用户在控制台上输入密码时则会以*号隐藏掉了。

好了今天就先分享到这里,后续会继续补充更新,敬请期待! 

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号