Rss Feed

嘉瑜的知性探索

2011年梦想主色调:书、茶、咖啡、红酒、运动、日记、音乐、自制美食、干净明亮的房间

程序猿小海棉1

2009-07-18 by ,   Category: 码农日记,   Tags:  No Comments  4次浏览  

读书笔记别人做得更细 …

1. javascript 仿多态方法。 arguements.length. 按入参数量即可

function onsuccessedmethod(result){
if (arguments.length == 1) // 实际传送进来的参数对象集合的长度 
{
     document.getElementById( "span1" ).innerHTML = result; }
} 


2.ado.net2.0 多出 DBConnection, DBCommand 类。并可用

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient") 

来实现数据库的工厂模式。

3.scriptmanager 一定要有 ID , asmx 里面的 webmethod 不可以是 static ,修改完后需要 compile ,完成后需要保存,不然都不会弹出 ws 类 。 pagemethod 必须是 static.


4. 使用 datetime.utcnow 存储时间 是好习惯(适用于多语言项目) 。

5.intA/intB, 如果 B 为 0 则溢出错,如果 B 为 floatB ,则不会有错。

6.javascript 里面也自带 String.format() 方法 ,使用方法同 C# 。

7. 异常处理的 JS 代码为(设返回的错误对象为 err ) .err.get_timedOut(), err.get_message(), err.get_exceptionType(), err.get_stackTrace().

8. 超时只能在 webservice 服务器方法中设置,也可以用 ws 类 .set_timeout(2000) ,在 JS 中进行设置(暂时不明白)

如果不这么设置,会一直等服务端的 thread.sleep(5000) 。


9. 复杂数据类型使用基础。

(1) 公有属性或公有 Field 会被释放和接受。

(2) 容器对象,实现 IList 接口的对象,实现 IDictionary 接口的对象( Key 必须是 Sstring)

10. 使用 Web Development Helper , enable HTTP Log 。查看 request body. 会发现它遵循一种著名的协议 application/json . 将对象序列化成一个串。比如: {"_employee":{"FirstName":"Elva","LastName":"Shi","Salary":1000,"DateOfPayOff":"\/Date(1244530860343)\/"}}

接下来这个字符串将被反序列化成一个对象到服务器端。

同样从 server 回来时会再次序列化成一个串。

{"d":{"__type":"HomeWeb.Employee","FirstName":"Elva","LastName":"Shi","DateOfPayOff":" \/Date(1244530860343)\/ ","Salary":2000,"FullName":"Elva,Shi"}}

11. 简化 callback 方法:

function reverse(arr)
{
    HomeWeb.ComplexType.Reverse(arr,
    function (result){ // 偷懒法,开发时不建议这样写,可读性降低。 
      document.getElementById( "span1" ).innerHTML = result;
}};} 

12. 客户端代理使用细节:

函数调用完整签名

Invoke(arg1, … ,argN, onSucceeded, onFailed, userContext)

回调函数完整签名

onSucceeded( resu lt , userContext , methodName)

onFailed( error ,userContext,methodName)

WebService 级别默认属性

Timeout

defaultUserContext

defaultSucceededCallback

defaultFailedCallback

(如何在服务器端获取 userContext? )

userContext : 调用 Web Service 时传递的用户上下文对象 . 可以是任何一个对象,多个对象可以用字典


13. 如果没有设置失败回调函数,则使用这个默认。

HomeWeb.WebserviceErrorHandler.set_defaultFailedCallback(failedCallback);

等等。

14.asp.net ajax 和 webservice 。不是利用了 ws 的 xml 什么 soap 什么的,只是利用了 WS 的方便性,使用了 json 协议和反射。

 

二.参数类型的序列化与反序列化

1. 复杂参数的基本使用方式:

作为参数的类型一定要有默认的构造函数,编译器自动生成默认的构造函数,手动编写默认的构造函数。

客户端设置类型共有的域变量及属性。设置的属性必须有 Setter 方法。

使用 JSON 进行传输格式 。

自动进行序列化及反序列化。

2. 生成复杂参数类型的客户端代理

a) 使用 GenerateScriptTypeAttribute 标记要生成代理的参数类型(输送到客户端去)

b) 可以标记在类,接口以及方法上 (可以标记在类上面)

c) 生成的代理中将包括客户端类型的代理

d) 调用方法时可以创建 ” 具体类型 ” new [namespaces].classname() ;没有其它构造方法(构造函数)

3. 客户端代理的作用 (scripttype)

在对象里做了一个标记 “ __typoe ” = “ ComplexType.Color ”

服务器端根据标记选择反序列化的目标类型

可出“多态”效果

if (typeof(HomeWeb.FulltimeEmployee) === ‘undefined’)

为什么三个等号呢? ( 恒等于,对数据类型也作强制判断 )

parseInt(100,10) ( 使用 十 进制 )

4. 可以使用这种方法来实现多态:

a) // 多态的效果

switch (val) {
    case "Intern" : emp = new HomeWeb.Intern(); break ;
    case "Vendor" : emp = new HomeWeb.Vendor(); break ;
    case "FullTimeEmployee" : emp = new HomeWeb.FulltimeEmployee(); break ;
} 

b)

< select id ="sel1">
    < option value ="HomeWeb.Intern" selected ="selected"> Intern </ option >
    < option value ="HomeWeb.Vendor"> Vendor </ option >
    < option value ="HomeWeb.FulltimeEmployee"> FullTime Employee </ option >
</ select > 

为了生成 {"emp":{"__type":"HomeWeb.FullTimeEmployee","Years":11}} 使用 var emp = new Object(); emp. __type = val; 需要最先来定义,放在第一个(表征类型的代理)


5. 使用 JavaScriptConverter 来返回一个数据类型(如 datatable )

复杂类型作为返回值时可能会出现问题(循环引用 ,如 for 等 )

解决方案(使用自定义数据类型封装复杂类型)(在 web.config 里定义 Converter )

6 .自定义 JavaScriptConverter

1) 用于处理复杂类型(处理循环引用)(简化默认的复杂序列化和反序列化行为)

2) 定义并使用一个 JavaScriptConverter

a) 定义一个 Converter 继承 JavascriptConverter 类

b) 实现 SupportedTypes

c) 实现 Serialize 方法用于序列化复杂数据

d) 实现 Deserialize 方法用于反序列化复杂数据

e) 在 web.config 内注册该 converter


7. 序列化与反序列化能力

a) JavaScriptConverter :自定义序列化与反序列化能力

b) JavaScriptTypeResolver :建立数据类型与标识符的映射

c) 不是真正的 JSON 序列化(时间日期对象)( Sys.Serialization.JavaScriptSerializer )

代码管理器, for ,按 tab 键即可

8. 使用 string.IsNullOrEmpty 方法测试 null 或空字符串 e.g. if(!string.IsNullOrEmpty(str)){…}



Tags:

Leave a Comment