4月 29

所谓的序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件中。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。反之,反序列化根据流重新构造对象。

序列化加 [Serializable]就可以了

    [Serializable]
    public class TestInfo
    {

        public int Id
        {
            get;
            set;
        }

        public string UserName
        {
            get;
            set;
        }
    }

如果不想序列化其中某个Field,则使用[NonSerialized]

序列化调用代码示例:

            List<TestInfo> list = new List<TestInfo>();
            list.Add(new TestInfo() { Id = 1, UserName = "测试1" });
            list.Add(new TestInfo() { Id = 2, UserName = "测试2" });
            list.Add(new TestInfo() { Id = 3, UserName = "测试3" });
            using (FileStream fs = new FileStream(@"C:\test.dat", FileMode.Create))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, list);
            }

反序列化调用代码示例

            List<Test> list = new List<Test>();
            using (FileStream fs = new FileStream(@"C:\test.dat", FileMode.Open))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                list = (formatter.Deserialize(fs) as List<TestInfo>);//在这里大家要注意咯,他的返回值是object
            }

written by ocean

4月 28

ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览 器中。

HttpModule会在页面处理前和后对页面进行处理,所以它不会影响真正的页面请求。通常用在给每个页面的头部或者尾部添加一些信息(如版 权声明)等.

IHttpModule与IHttpHandler的区别整理
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的
2.对请求的处理上:
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

HttpModule 继承System.Web.IHttpModule接口,实现自己的HttpModule类。必须要实现接口的两个方法:Init和Dispose。在 Init中,可以添加需要截取的事件;Dispose用于资源的释放,如果在Init中创建了自己的资源对象,请在Dispose中进行释放。

例: public class TestHttpModule:IHttpModule
{

public void Dispose()
{ }

public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}

void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication appliction = sender as HttpApplication;
appliction.Response.Write("HttpModule请求的URL:" + appliction.Request.Url.AbsolutePath);
}
}

自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪 等

HttpHandler是完全的对Http Request的截取。
首先,继承System.Web.IHttpHandler接口,实现自己的HttpHandler类。必须要实现接口的ProcessRequest方 法和IsReusable属性。ProcessRequest方法中完成对每个Http Request的处理,发送处理结果的HTML到输出缓存中。IsReusable属性被.Net Framework调用,用以确定这个HttpHandler的实例是否可以被重用于同类型其它的Request处理。
如果你在自己的HttpHandler类中,需要读取或者是写Session值,需要再继承一个接口IRequiresSessionState。这个接 口没有任何方法,只是一个标记接口。继承这个接口之后,就可以在自己的HttpHandler中访问Session,可以在Session中写入值。
例: public class TestHandler:IHttpHandler
{

public bool IsReusable
{ get { return true; } }

public void ProcessRequest(HttpContext context)
{
string s = context.Request.Url.AbsolutePath;
context.Server.Execute("default.aspx?execute=" + context.Server.UrlEncode(s));//URL重定向
}
}

<add verb="*" path="*.shtml" type="UI.Core.Http.TestHandler,UI"/>

对于请求时的 a.shtml可以不存在

written by ocean

4月 22

首先CMS里输入命令:

netstat -an -p tcp -o

然后在Local Adress 中找到80端口

用任务管理器在PID中找到使用80端口的服务

结束它,IIS又能启用了

written by ocean

4月 18

做点东西,本地的iis很容易出现连接数过多的问题

查了下,xp下默认iis连接数只有10,可以更改iis数

记录一下

首先,你需要到下面的地址下载MetaEdit,最新版本是2.2,地址

http://download.microsoft.com/download/iis50/Utility/5.0/NT45/EN-US/MtaEdt22.exe

然后执行MtaEdt22.exe按向导提示完成安装。最后,在MetaEdit中设置客户端连接限制的参数。安装MetaEdit完毕后,在开始菜单的程序组Administrative Tools下点击MetaEdit 2.2运行,出现窗口:

窗口的左边将树展开至LM W3SVC,直接在W3SVC文件夹上单击,选择右边列表中Name为MaxConnections的项,双击后,出现对话框:



在最后Data的文本框中默认的是10,这就是Windows XP专业版IIS默认设置的最大客户端连接数了,现在你可以改变这个默认值了,我把它改为10000,注意:在Win2000 上的IIS客户端连接数最大为2000000000。

written by ocean

4月 14

基础知识之最大化,最小化,系统托盘图标,右键菜单,提示气球

琢磨了一下C/S软件,打算做一个,先记录一下基础的东西

1.最小化
WindowState = FormWindowState.Minimized;
//最小化时隐藏窗体
this.Visible=false;

2.最大化
WindowState == FormWindowState.Maximized;

3.还原为正常
WindowState == FormWindowState.Normal;

4.系统托盘图标
加notifyicon控件notifyicon1,为控件notifyicon1的属性icon添加一个icon图标。

        /// <summary>
        /// 显示出来
        /// </summary>
        private void BigShow()
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Normal;
            this.notifyIcon1.Visible = false;
        }

        /// <summary>
        /// 最小化
        /// </summary>
        private void MinHide()
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.notifyIcon1.ShowBalloonTip(3, "提示", "您已经最小化,可以点击这里出来", ToolTipIcon.Info);
                this.Hide();
                this.notifyIcon1.Visible = true;
            }
        }

5.可以给notifyicon添加右键菜单:

主窗体中拖入一个contextmenu控件contextmenu1,点中控件,在上下文菜单中添加菜单,notifyicon1的contextmenu行为中选中contextmenu1作为上下文菜单。

6.点出来,右键菜单
        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)//左键最大化
            {
                this.BigShow();
            }
            else if(e.Button==MouseButtons.Right)//右键弹出菜单
            {
               
            }
        }
7.关闭程序
Application.Exit();

written by ocean

4月 14
//好久没有用多线程了,好多都忘记了
//记一下
 //带object参数的ParameterizedThreadStart:
 
 
 
public void Start()
 {
       for (int index = 0; index < 10; index++)
       {
  
           #region -- 准备参数 --
           List<int> list = new List<int>();
           for (int param = index; param < index + 10; param++)
           {
               list.Add(param);
           }
           #endregion
  
           Thread thread = new Thread(new ParameterizedThreadStart(InitThreadFunc));
           thread.Start(list);
       }
       LogHelper.WriteLine("Over");
  
}
  
 /// <summary>
 /// 执行的函数
 /// </summary>
 /// <param name="list"></param>
 private void InitThreadFunc(object list)
 {
       if (list is List<int>)
       {
           List<int> ll = list as List<int>;
           int result = 0;
           foreach (int n in ll)
           {
               result += n;
           }
           LogHelper.WriteLine(result);
}
//第二种:
  
 
 //不带参数的 InitThreadFunc
  
 
  
public void Start()
 {
  
       for (int index = 0; index < 10; index++)
       {
  
           Thread thread = new Thread(new ThreadStart(InitThreadFunc));
           thread.Start();
       }
       LogHelper.WriteLine("Over");
  
 }
  
  
 private void InitThreadFunc() { }

written by ocean

4月 13

反射的补充

加载程序集,获取各种item

代码很明确,直接上了

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Reflection;

namespaceFanShe
{
    publicclassTest
    {
        AssemblymyAssembly=null;

        publicTest()
        {
            //第一种方法:
           // myAssembly=Assembly.LoadFrom(@"E:\study\TestDemo\FanShe\bin\Debug\FanShe.exe");//路径

            //第二种方法
            myAssembly=Assembly.Load("FanSheDll");//注意,此处是因为程序集名为"FanSheDll",而不是"FanShe.Dll",加载的其它dll  

        }

        publicvoidStart()
        {
            Assembly[]assemblys=AppDomain.CurrentDomain.GetAssemblies(); //得到当前的所有程序集

            foreach (Assemblyiteminassemblys)
            {
                this.getreflectioninfo(item);
            }
        }

        //定义一个获取反射内容的方法
        privatevoidgetreflectioninfo(Assemblymyassembly)
        {
            Type[]typearr=myAssembly.GetTypes();//获取类型
            foreach (Typetypeintypearr)//针对每个类型获取详细信息
            {
                //获取类型的结构信息
                ConstructorInfo[]myconstructors=type.GetConstructors();

                //获取类型的字段信息
                FieldInfo[]myfields=type.GetFields();

                //获取方法信息
                MethodInfo[]myMethodInfo=type.GetMethods();

                //获取属性信息
                PropertyInfo[]myproperties=type.GetProperties();

                //获取事件信息
                EventInfo[]Myevents=type.GetEvents();
            }
        }

    }
}

written by ocean

4月 13

为什么要用反射呢,既然在开发时就能够写好代码,干嘛还放到运行期去做,不光繁琐,而且效率也受影响。
带着这个疑问,google了一把,找到一个非常好的解释:

1)当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?因为程序是支持插件的(第三方的),在开发的时候并不知道 。所以,无法在代码中 New出来 ,但反射可以, 通过反射, 动态加载程序集, 然后读出类, 检查标记 (特性 attributable)之后再实例化对象。就可以获得正确的类实例。反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。很多工厂模式就是使用的反射。

2)在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象.

不过反射还是能不用就尽量不用,毕竟是要耗费性能的

written by ocean

4月 13

这两天研究了一下反射,将一个简单的反射调用记录一下,以防遗忘

直接上代码了

要被反射的类User:

using System;
using System.Collections.Generic;
using System.Text;

namespace FanShe
{
    public class User
    {
        public User(string name)
        {
            this.Name = name;
        }

        public User(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public string Name
        {
            get;
            set;
        }

        public int Age
        {
            get;
            set;
        }

        public void Display()
        {
            Console.WriteLine(string.Format("姓名:{0},年龄:{1}", this.Name, this.Age));
        }

        public string GetUserInfo(string sex)
        {
            return string.Format("姓名:{0},年龄:{1},性别:{2}", this.Name, this.Age, sex);
        }
    }
}

反射调用的代码,注释写的很清楚了

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace FanShe
{
    public class Test
    {
        public void Start()
        {
            //获取类型信息
            Type type = Type.GetType("FanShe.User");

            //构造函数的参数
            object[] constuctParms = new object[] { "ysuhy",25 };
            //创建对象
            object obj = Activator.CreateInstance(type, constuctParms);

            //调用Display方法
            MethodInfo method = type.GetMethod("Display");
            BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
            //调用方法,用一个object接收返回值
            method.Invoke(obj, flag, Type.DefaultBinder, null, null);

            //调用GetUserInfo方法
            method = type.GetMethod("GetUserInfo");
            flag = BindingFlags.Public | BindingFlags.Instance;//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
            //调用方法,用一个object接收返回值
            object result = method.Invoke(obj, flag, Type.DefaultBinder, new object[] { "男" }, null);

            Console.WriteLine("通过反射调用方法GetUserInfo获取到的结果" + result);
        }
    }
}

执行结果:


written by ocean

4月 13

Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.

是希腊字母的第一位
表示最初级的版本

alpha就是α,beta就是β

alpha版就是比beta还早的测试版,一般都是内部测试的版本

——————–
Beta:
  很容易理解就是测试版,这个阶段的版本会一直加入新的功能。

RC:(Release Candidate)
  Candidate是候选人的意思,用在软件上就是候选版本。Release.Candidate.就是发行候选版本。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错!

RTM:全称为Release to Manufacture。
  是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM.也有出120天评估版。但是说RTM.是测试版是错的。正式在零售商店上架前,是不是需要一段时间来压片,包装、配销呢?所以程序代码必须在正式发行前一段时间就要完成,这个完成的程序代码叫做Final.Code,这次Windows.XP开发完成,外国媒体用Windows
XP.goes.gold来称呼。程序代码开发完成之后,要将母片送到工厂大量压片,这个版本就叫做RTM版。所以说,RTM版的程序码一定和正式版一样。但是和正式版也有不一样的地方:例如正式版中的OEM不能升级安装,升级版要全新安装的话会检查旧版操作系统光盘等,这些就是RTM和正式版不同的地方,但是它们的主要程序代码都是一样的。

OEM:
  是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装
,不能从旧有操作系统升级。如果买笔记型计算机或品牌计算机就会有随机版软件。包装不像零售版精美,通常只有一面CD和说明书(授权书)。

RVL:
  号称是正式版,其实RVL.根本不是版本的名称。RVL.是一个Warez.Team,台湾分部叫RVL@TW.,它之间又释出一个.WinXP.RVL@TW.版本。它是某中文版+英文Corpfiles档破解的。

EVAL:
  而流通在网络上的EVAL版,是微软帮媒体记者编辑上课给的,是所谓的「评估版」没错,你输入的金钥是30天的,就可用30天,输入的是180天的,就可用180天。功能上和零售版几乎没有区别。

RTL:Retail.(零售版)
  是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。

———————

RC=Release Candidate

平时只理解了Release,而不懂这个“C”的含义,C是候选人的意思。

也就是说这还不能算是正式的发布版。

版本号:
V(Version):即版本,通常用数字表示版本号。(如:EVEREST Ultimate v4.20.1188 Beta )
Build:用数字或日期标示版本号的一种方式。(如:VeryCD eMule v0.48a Build 071112)
SP:Service Pack,升级包。(如:Windows XP SP 2/Vista SP 1)

开发阶段划分:
α(Alpha)版:内测版,内部交流或者专业测试人员测试用。Bug较多,普通用户最好不要安装。
β(Beta)版:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装。
γ(Gamma)版:相当成熟的测试版,与即将发行的正式版相差无几。
RC版:是 Release Candidate 的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。

授权和功能划分:
Trial:试用版,通常都有时间限制,有些试用版软件还在功能上做了一定的限制。可注册或购买成为正式版。,

Unregistered:未注册版,通常没有时间限制,在功能上相对于正式版做了一定的限制。可注册或购买成为正式版。
Demo:演示版,仅仅集成了正式版中的几个功能,不能升级成正式版。
Lite:精简版。
Full version:完整版,属于正式版。

语言划分:
SC:Simplified Chinese简体中文版。
CN : 简体中文版
GBK:简体中文汉字内码扩展规范版。
TC:Traditional Chinese繁体中文版。
CHT : 繁体中文版
BIG5:繁体中文大五码版。
EN : 英文版
Multilanguage : 多语言版
UTF8:Unicode Transformation Format 8 bit,对现有的中文系统不是好的解决方案。

其他版本
Enhance :增强版或者加强版 属于正式版1
Free :自由版
Release :发行版 有时间限制
Upgrade :升级版
Retail  :零售版
Cardware :属共享软件的一种,只要给作者回复一封电邮或明信片即可。(有的作者并由此提供注册码等),目前这种形式已不多见。/ S
Plus :属增强版,不过这种大部分是在程序界面及多媒体功能上增强。
Preview :预览版
Corporation &  Enterprise :企业版
Standard :标准版
Mini :迷你版也叫精简版只有最基本的功能
Premium : 贵价版
Professional : 专业版
Express : 简易版

Deluxe : 豪华版
Regged : 已注册版

written by ocean