在.NET Framework 2.0中,泛型第一次被引入。我们可以定义泛型接口、泛型类型、泛型委托和泛型方法。序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念。...由于范型类型和集合类型在序列化和反序列化上具有一些特殊的行为和规则,在这篇文章中,我将会对此进行详细介绍。上篇先来说所泛型数据契约。...在真正创建范型对象或者调用该方法的时候,才指定其具体的类型。 就实现来说,泛型是CLR和编程语言(或者是基于编程语言的编译器)共同实现的一种特殊机制;就泛型的概念来说,这是面向对象的范畴。...、Unity之间的集成 WCF技术剖析之八:ClientBase中对ChannelFactory的缓存机制 WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?...(上篇) WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇) WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 WCF技术剖析之十六:数据契约的等效性和版本控制
对于服务契约来说,我们在一个接口或者类上面应用的ServiceContractAttribute将其定义成服务契约后,并不意味着该接口或者类中的每一个方法成员都是服务操作,而是通过OperationContractAttribute...我们照例定义一个泛型的辅助方法进行专门的序列化工作,最终生成的XML保存到一个XML文件中。...(比如TotalPrice属性的值不会出现在序列化后的XML中); 所有数据成员均以XML元素的形式被序列化; 序列化后数据成员在XML的次序采用这样的规则:父类数据成员在先,子类数据成员在后...在这里需要对上面定义的泛型辅助的Serialize方法作相应的修正,加入preserveObjectReferences参数,并通过该参数创建相应的DataContractSerializer对象...需要注意的是Customer类中定义了两个属性:CompanyAddress和ShipAddress,它们的类型均为Address。
当我们使用基于接口或者抽象类创建的DataContractSerializer去序列化一个实现了该接口或者继承该抽象类的实例的时候,往往会因为对对象的真实类型无法识别造成不能正常地序列化。...比如下面的代码中,我们定义了3个类型,一个接口、一个抽象类和一个具体类。...] 42: public double TotalPrice 43: { get; set; } 44: } 45: } 当我们通过下面的方式去序列化一个Order对象(注意泛型类型为IOrder...在下面的代码中,在调用Serialize的时候,将泛型类型分别设定为接口IOrder和抽象类OrderBase。虽然是对同一个Order对象进行序列化,但是序列化生成的XML却各有不同。...下面的代码中,在基类OrderBase指定了子类的类型Order。
第19集 创建然后抛出强类型的SOAP faults Creating and throwing strongly typed SOAP faults 上一集介绍了使用SOAP fault而不是默认的...创建一个类用来表示SOAP fault,给类加上DataContract特性(因为客户端要用这个),里面的属性用DataMember特性修饰。...[DataContract] public class DivideByZeroFault { [DataMember] public string Error...把原先的throw FaultException改成泛型的FaultException public class CalculatorService : ICalculatorService...这集好像挺简单的,讲了如何使用FaultException来添加自定义的error message。 Thank You !
使用非泛型集合的委托方法 先看看.NET类中的一个返回列表数据的方法: //返回List或者数组,不影响 C++调用 public List GetUsers(string...,好在IEnumerable也是继承 IEnumerable 的,所以可以当做非泛型对象在C++中访问,因此创建上面的委托方法是可行的。...创建泛型List实例 我们使用List来做集合对象,在C#中,我们可以通过下面的方式得到List泛型的类型,然后进一步创建泛型对象实例: Type t= typeof(List); 但是,对应的C+...为什么要反射创建实体类? 因为CreateGenericList(interfaceType) 创建的是一个泛型List对象,要求它的成员是一个实体类。...一切准备就绪,下面可以通过以下步骤提交集合数据给.NET方法了: 1,反射.NET方法,获取参数的泛型形参类型; 2,创建此泛型形参的泛型List对象实例; 3,遍历C++集合(列表list),将结构数据赋值给动态创建的实体类对象
]标记 是为了客户端与服务端传输数据的时候序列化与反序列化引入的 2: MenuM类继承自Entity类 然而在.net 3.5中是没有Entity类的 那么我们就创建了这个类(就是Attr文件夹下的...菜单名称")] 如上:Display特性在dotNet3.5中也是不存在的 同理,我们创建了DisplayAttribute特性,也是为了使用Silverlight4.0的客户端特性 namespace...获取服务端类信息使用了反射 我们反射出类的名字,类中的方法名,参数名,参数类型,返回值类型等 来生成形如下面这样的服务端代理 public class MenuService {..., 会遇到获取泛型类型的情况(如:List~<…....if (t.Name.StartsWith("List")) { var gtype = t.GetGenericArguments().FirstOrDefault
第一步:在vs2008中创建一个支持.Net Framework 3.5,名称为:ExtJs_Wcf_Linq_PageGrid的Asp.Net网站, ?...在这个步骤中,主要目的是在项目创建一个Lint to Xml类,这个类用于Linq与数据表Product进行交互。使用Linq To Sql可以产生一个实体类和一个数据访问类。...、 拖动成功之后,便有vs2008的IDE自动生成了有关Product的实体类和linq操作数据表Product的操作类:ProductsDataContext,在可视化界面中也能有如下的显示: ?...设计一个用于与ExtJs进行分页交互的PageData泛型类: using System; using System.Data; using System.Configuration; using... get; set; } } } 这个泛型类用于WCF与ExtJS的Grid控件交互,T是返回的具体数据类型的集合,TotalRecord是总记录数。
只读属性不作序列化 类名和成员名按类声明中的确切呈现写入XML 使用XML的默认命名空间 如果需要在序列化上的更多控制,可以用DataContract注解属性修饰类。...要改变类名在XML中的呈现,请在DataContract注解属性中设置Name参数。 要改变成员名在XML中的呈现,请设置DataMember注解属性中的Nmae参数。...要改变XML命名空间,请设置DataContract类中的Namespace参数。 Read-Only Properties——只读属性 只读属性是不被序列化的。...如果只读属性有一个支撑private字段,可以用DataMember注解属性对这个private字段进行标记。这种办法需要在类上使用DataContract注解属性。...; xml.Indent = true; 设置每一类型(Per-Type)的XML序列化器 你可以为不同的CLR类型设置不同的XML序列化器。
所以便有了创建一个简易版基于MongoDB官方驱动的ORM的想法。 1677984339841.jpg 设计思路 对象实体基类 为什么要创建实体对象基类?...是因为官方驱动支持的实体类与Collection得映射,必须要有id字段,对应数据库中得"_id",并且这个字段是ObjectIDl类型,像这样: public class Person {...= true)] //当BSON文档被反序列化时,每个元素的名称用于在类映射中查找匹配的成员。...(tableStr); } } 实现Repository仓储类.提供简单的CRUD方法 创建仓储类的泛型接口 public interface IRepository> conditions = null); } 泛型仓储类实现接口,通过管理器获取自动映射得到的 IMongoCollection public class Repository
对非泛型接口IEnumerator和Enumerable来说也同样如此 类型要么应该是集合,要么应该是个枚举器,但不能两者都是。 6) 集合参数 A.要用最泛的类型来作为参数类型。...要用ReadOnlyCollection或其子类,在少数情况下用IEnumerable,如果属性或返回值表示只读属性 D.考虑使用泛型集合基类的子类,而不要直接使用该集合 自定义的集合类型可以有更好的命名...考虑实现非泛型集合(IList/ICollection)接口——如果经常需要把集合传给以这些参数为输入的API。...class OrderCollection :ILIst, IList { ... } C.避免为类型实现集合接口——如果类型的API很复杂,而且与集合的概念无关 D.不要继承自非泛型的集合基类...考虑在覆盖Object.Equals方法的同时实现IEquatable接口 D.不要从Equals方法中抛出异常 E.
DataContract的设计与实现 DataContract项目存放着服务工作流中涉及的所有DTO对象,因为将使用WCF模型来暴露服务,所以添加相关的特性(Attribute)来修饰属性进行序列化。...public class MessageResponseHistory { //将与给定关联标识符的服务响应结果存放在内存中,可能没有必要保存每一条的结果,因此可以处理只缓存最近...如果找到匹配响应则从MessageResponseHistory对象中检索出响应返回给客户端,以确保在客户端重复调用该服务时不会出现预料之外的问题。...purchaseTicketRequest); } } TicketServiceClientProxy继承自ClientBase,Visual Studio自动替我们创建代理服务时正是使用该基类...我们将创建一个门面,把与服务通信的复杂读隐藏起来(只提供简单API),并让客户端应用与服务松散耦合,从而有助于测试。这个服务门面将使用两个特定的Presentation模型类。
的网站项目ExtJsTreeWcf 第二步: 在网站项目中创建一个启用了Ajax的WCF服务WcfTreeService.svc,创建好之后,对该服务做如下的更改: 1)在WcfTreeService.svc...添加Factory之后的html为 2)去除web.config中的 第三步:在WcfTreeService.svc修改代码为: [DataContract]...] public List children = new List(); [DataMember] public string cls; [DataMember... List nodes = new List(); nodes.Add(t); nodes.Add(t1); return nodes.ToArray()...增加如下的页面元素: ExtJs与WCF交互-树 在中添加如下脚本: <script
在GetDataContractType中,如果发现类型是Contact,则替换成Customer。...,创建了Serialize和Deserialize两个辅助方法,通过创建DataContractSerializer进行序列化和反序列化。...WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理 WCF技术剖析之十一:异步操作在WCF中的应用(上篇) WCF技术剖析之十一:异步操作在WCF中的应用(下篇) WCF技术剖析之十二:数据契约...(Data Contract)和数据契约序列化器(DataContractSerializer) WCF技术剖析之十三:序列化过程中的已知类型(Known Type) WCF技术剖析之十四:泛型数据契约和集合数据契约...(上篇) WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇) WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 WCF技术剖析之十六:数据契约的等效性和版本控制
也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。...在创建 List 集合时,同样使用了泛型,因此在获取集合中的元素时也不需要将 bookList.get(i) 代码强制转换为 Book 类型,程序会隐式转换。...Java 泛型支持声明一个以上的类型参数,只需要将类型用逗号隔开即可。 泛型类一般用于类中的属性类型不确定的情况下。...在实例化泛型类时,需要指明泛型类中的类型参数,并赋予泛型类属性相应类型的值。例如,下面的示例代码创建了一个表示学生的泛型类,该类中包括 3 个属性,分别是姓名、年龄和性别。...在测试类中调用 Stu 类的构造方法实例化 Stu 对象,并给该类中的 3 个属性赋予初始值,最终需要输出学生信息。
在.NET中,基于Primary Type,比如Int32,String等等,他们具有一个简单的默认的序列化方式和结构,可以说他们不需要Data Contract。...所以WCF需要为此提供这样的机制:基于不同的泛型类型参数生成不同Data Contract Name,这样才能解决命名冲突。...> DetailList { get; set; } } 其中{0}和{1}分别代表第一个泛型类型参数和第二个泛型类型参数的名称,一次类推,你可以根据参数类型的个数设置{2}{3}… 这样我们生成的两个...但是这并没有根本解决问题,如果在我现在不同的Namespace中创建了两个OrderHeader和OrderDetail呢?...这无疑在.NET中是合法的,但是对于DataContract有有可能出现命名冲突。 这也就是为什么WCF默认机制下会为Data Contract Name添加一个额外hash value的原因。
泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者法的返回值的类型,或者是参数类型。...静态方法中不能使用类的泛型,因为静态是与类相关的,因此类的加载时对象还没有创建,因此无法指定静态方法/变量的类型。如果静态方法和静态属性使用了泛型,JVM就无法完成初始化。...静态方法中不能使用类的泛型 class Tiger { String name; R r; //属性使用到泛型 M m; T t; //因为数组在...= r; this.m = m; this.t = t; } //因为静态是和类相关的,在类加载时,对象还没有创建 //所以,如果静态方法和静态属性使用了泛型...(参数列表){} 注意细节 泛型方法,可以定义在普通类中,也可以定义在泛型类中 当泛型方法被调用时,类型会确定 public void eat(E e) {}.修 饰符后没有 <T,R…
Collection,List,ArrayList 这个就是类型参数,即泛型 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。...JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。 那么为什么要有泛型呢,直接Object不是也可以存储数据吗?...泛型的指定中不能使用基本数据类型,可以使用包装类替换。 9. 在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态 属性的类型、非静态方法的参数类型、非静态方法的返回值类型。...在泛型 方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。 ...:实际案例 用户在设计类的时候往往会使用类的关联关系,例如,一个人中可以定义一个信息 的属性,但是一个人可能有各种各样的信息(如联系方式、基本信息等),所以此信 息属性的类型就可以通过泛型进行声明,
public class Generic { public T Field; } 创建泛型类的实例时,指定用于替代类型形参的实际类型。...(大多数情况下,应使用 .NET Framework 类库提供的 List 类,而不是自行创建类。)在通常使用具体类型来指示列表中所存储项的类型的情况下,可使用类型参数 T。...其使用方法如下: 在 AddHead 方法中作为方法参数的类型。 在 Node 嵌套类中作为 Data 属性的返回类型。 在嵌套类中作为私有成员 data 的类型。...泛型概述 使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。 泛型最常见的用途是创建集合类。...应尽可能使用这些类来代替某些类,如 System.Collections 命名空间中的 ArrayList。 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
我们可以在定义集合时设置泛型这样的约束,也可以在定义类和方法时加上泛型,这样能提升类和方法的灵活性。此外我们还可以在定义泛型时加上继承和通配符。...在平时的培训中,我曾发现初学者对一些复杂的泛型(其实也不复杂,只不过是较少用)感到困惑。这里就通过一些案例展示泛型在项目里的常见用法。...().toString());} 21 } 22 } 在第3行定义WareHourse这个类时,我们加上了泛型约束T,而在这个类的属性和方法里,我们又多处用到了这个泛型T。...比如,在第4行里通过T来创建一个含泛型约束的List,在第13行添加元素的方法里,参数是T,在第16行打印所有对象的printAllItems方法里,我们在第18行创建迭代器时,也用到了泛型T。...在第50行里,我们指定了泛型类型是自定义的Item;如是,在第51和52行调用addItem方法时,传入的参数就需要是Item类型了。 在这个例子中,我们把泛型作用到类上。
(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法 泛型: 把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型 3 泛型类和泛型方法的示例...T printData(T t){ System.out.println(t); return t; } } 接口和抽象类都可以使用泛型 4 类型擦除 创建泛型的实例时...;或者泛型属性定义在泛型类A中,并使用泛型类A的泛型参数T时,其泛型参数都会被编译器定为泛型变量TypeVariable,而不是被擦除 public class MainTest {...= List.class编译时不通过的;还有就是直接通过泛型类new创建的对象,其Class并非ParameterizedType类型,而是泛型本身的class,示例如下 public...) // 2 获取在类内部定义的泛型属性,需指定具体泛型参数 // 3 局部代码,可以通过泛型的匿名内部子类(需指定具体泛型参数)获取ParameterizedType类型 public class MainTest
领取专属 10元无门槛券
手把手带您无忧上云