8月27日学习记录

时间:2022-02-24 13:44:43

关于序列化问题

1、序列化定义:将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。

在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本

序列化理解:
1 序列化就是将文件以二进制的方式保存,直接打开是乱码,但是程序读取出来后就是正常的信息,有助于文件信息的安全,同时,序列化使文件的读取与保存变得更容易,更简洁!

2 .序列化(Serialization,又译作“串行化”)就是把对象保存到文件中,然后可以在以后再读取文件生成原来的对象。.NET支持多种格式的序列化,楼上说的那种是二进制序列化,此外还有XML序列化等等。相对来说,在.NET中使用二进制序列化是最简单的,功能也最强大。这个功能用到System.Runtime.Serialization.Formatters.Binary命名空间下的BinaryFormatter类

单地说,就是内存中对象的持久化。例如,你现在有个类型为C的对象obj,这个对象保存了一些信息,希望能够传输到远程计算机或者程序下次运行时使用,这时候就可以使用序列化。序列化将对象保存的信息(通常是字段)保存为二进制、xml或者soap(前者是二进制流、后者是字节流),而序列化是.NET自动完成的,编程者不需要写许多额外的代码指示序列化应当如何完成。这样这些信息可以发送给远端或者保存下来。需要恢复原有的对象obj时,进行反序列化,就可以得到和obj一摸一样的C类型的对象了。

 

2、使用序列化的原因:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 ASP.NET 中保存会话状态,以及将对象复制到 Windows 窗体的剪贴板中。它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。本文简要介绍了 Microsoft .NET 中使用的序列化。

参考http://www.cnblogs.com/winner/archive/2008/03/25/1120757.html

①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中
②序列化以某种存储形式使自定义对象持久化;
③将对象从一个地方传递到另一个地方。
④将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。
⑥序列是指将对象的实例状态存储到存储媒体的过程。
在此过程中,先将对象的公共字段以及类的名称(包括类的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
⑦用处非常大,用于数据传输,对象存贮等。

C#_Stopwatch 类

命名空间:System.Diagnostics

Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。在典型的 Stopwatch 方案中,先调用Start 方法,然后调用 Stop 方法,最后使用 Elapsed 属性检查运行时间。

Stopwatch 实例或者在运行,或者已停止;使用 IsRunning 可以确定 Stopwatch 的当前状态。使用Start 可以开始测量运行时间;使用Stop 可以停止测量运行时间。通过属性ElapsedElapsedMillisecondsElapsedTicks 查询运行时间值。当实例正在运行或已停止时,可以查询运行时间属性。运行时间属性在Stopwatch 运行期间稳固递增;在该实例停止时保持不变。

默认情况下,Stopwatch 实例的运行时间值相当于所有测量的时间间隔的总和。每次调用 Start 时开始累计运行时间计数;每次调用Stop 时结束当前时间间隔测量,并冻结累计运行时间值。使用Reset 方法可以清除现有 Stopwatch 实例中的累计运行时间。

Stopwatch 在基础计时器机制中对计时器的刻度进行计数,从而测量运行时间。如果安装的硬件和操作系统支持高分辨率性能的计数器,则Stopwatch 类将使用该计数器来测量运行时间;否则,Stopwatch 类将使用系统计数器来测量运行时间。使用FrequencyIsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。

 C#反射中Assembly.Load及Assembly.Load.CreateInstance方法介绍   

在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:

System.Reflection命名空间

(1)AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器

(2)Assembly:程序集类

(3)Module:模块类

(4)Type:使用反射得到类型信息的最核心的类他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type. AppDomain这个类我们等下再来讲解。我们先关注Assembly个类,在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFrom和LoadWithPartialName三个Assembly的静态方法先来讲解Assembly.Load方法,该方法会有多个重载版本,其中一个就是提供程序集的详细信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记,全部都是以一个字符串的形式提供.

例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”那么,使用Assembly.Load加载程序集的顺序是怎样的呢?首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。当然,如果你使用的是弱命名程序集,也即只给出程序集的名称,那么这个时候,CLR将不会在程序集上应用任何安全或者部署策略,而且Load也不会到全局缓存程序集中查找程序集。

Assembly.Load("")的使用说明如下;并不是命名空间。常用的是程序集名称,也就是dll的名称

名称

说明

Load(AssemblyName)

在给定程序集的AssemblyName的情况下,加载程序集。

Load(array<Byte>[]()[])

加载带有基于通用对象文件格式 (COFF)的图像的程序集,该图像包含已发出的程序集。将该程序集加载到调用方的域。

Load(String)

通过给定程序集的长格式名称加载程序集。

Load(AssemblyName, Evidence)

在给定程序集的AssemblyName的情况下,加载程序集。使用提供的证据将该程序集加载到调用方的域中。

Load(array<Byte>[]()[], array<Byte>[]()[])

加载带有基于通用对象文件格式 (COFF)的图像的程序集,该图像包含已发出的程序集。

Load(String, Evidence)

通过给定的程序集的显示名称来加载程序集,使用提供的证据将程序集加载到调用方的域中。

Load(array<Byte>[]()[], array<Byte>[]()[], Evidence)

加载带有基于通用对象文件格式 (COFF)的图像的程序集,该图像包含已发出的程序集。

关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有

注意CreateInstance()一定是命名空间.类名,否则创建的实例为空

Assembly.Load("程序集名") Assembly.LoadFrom("程序集实际路径")

IEnumerable接口:

IEnumerable接口的字面意思是:可迭代的。所以这个接口告诉用户,只要是这个实现了这个接口的对象都可以用来遍历。至于怎样遍历,那不同的类不同,你要为你自己的类填写遍历算法,就是你看到的东西。

关于Linq的学习

查询中返回一系列结果,查询变量本身不去拥有查询结果,着意味这你可以执行查询随你所需要,数据源没时刻更新,你也可以随时执行查询获得不同的数据.
Immediate Execution
与前面的不同,即使查询获得单独的一个值而且是立即的,例如Count,
Max,Average,First,这些查询立即获得一个单独的值,如下
int query = (from num in numbers
              where (num % 2) == 0
              select num).Count();
还有强制获得立即查询并且不是获得一个单独的值可以通过调用
ToList或者ToArray方法在一个查询变量身上
如下
List<int> query2 =
     (from num in numbers
      where (num % 2) == 0
      select num).ToList();
// or
var query3 =
     (from num in numbers
      where (num % 2) == 0
      select num).ToList();

 

一些Linq语句:

使用select和匿名类型返回仅含客户联系人和电话号码的序列

var q=from c in db.Costomers select new {c.ContactName,c.Phone};

var...{e.FirstName+""+e.LastName, phone=e.HomePhone};

var...{p.ProductID,Halfprice=p.UnitPrice/2};

使用select和匿名类型返回有关客户的数据的整形子集,查询顾客的ID和公司的信息(公司名称,城市,国家)以及联系方式(联系人和职位)

var q=from c in db.Customers select new {c.CustomerID,CompanyInfo=new{c.CompanyName,c.City,c.Courntry},ContactInfo=new{c.ContactName,c.ContactTitle}

};

distinct形式(不重复的结果集):

var q=(from c in db.Customers select c.City).Distinct();

Count:

var q=db.Customers.Count()/LongCount();

Sum:

var q=db.Orders.Select(0=>o.Freight).Sum();

Min:

var q=db.Products.Select(p=>p.UnitPrice).min();

Max:

var q=db.Employees.Select(e=>e.HireDate).Max();

Average:

var q=db.Orders.Select(o=>o.Freight).Average();

 降序排序:

var q=from p in db.Products orderby p.UnitPrice descending select p;